From 4ce1835f939ad7c0e5e4c130bb7c34c3fbd8c5a9 Mon Sep 17 00:00:00 2001 From: uzma Date: Wed, 12 Jul 2023 01:23:19 +0100 Subject: [PATCH 001/831] [BAEL-6689] code for zipwhen --- .../baeldung/webflux/zipwhen/model/User.java | 22 ++++++++++ .../zipwhen/service/DatabaseService.java | 37 ++++++++++++++++ .../webflux/zipwhen/service/EmailService.java | 29 ++++++++++++ .../webflux/zipwhen/service/UserService.java | 15 +++++++ .../webflux/zipwhen/web/UserController.java | 44 +++++++++++++++++++ .../webflux/zipwhen/UserControllerTest.java | 42 ++++++++++++++++++ 6 files changed, 189 insertions(+) create mode 100644 spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/model/User.java create mode 100644 spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java create mode 100644 spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java create mode 100644 spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java create mode 100644 spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java create mode 100644 spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/model/User.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/model/User.java new file mode 100644 index 0000000000..37008bb061 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/model/User.java @@ -0,0 +1,22 @@ +package com.baeldung.webflux.zipwhen.model; + +public class User { + + private final String id; + private final String email; + + public User(String id, String email) { + this.id = id; + this.email = email; + + } + + public String getId() { + return id; + } + + public String getEmail() { + return email; + } + +} diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java new file mode 100644 index 0000000000..b7e7a1aa50 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java @@ -0,0 +1,37 @@ +package com.baeldung.webflux.zipwhen.service; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import com.baeldung.webflux.zipwhen.model.User; + +import reactor.core.publisher.Mono; + +public class DatabaseService { + private Map dataStore = new ConcurrentHashMap<>(); + + // public Mono saveUserData(User user) { + // + // + // return Mono.fromRunnable(() -> { + // // Simulate saving the user data to a database or data store + // dataStore.put(user.getId(), user); + // + // + // }); + // } + //} + + public Mono saveUserData(User user) { + return Mono.create(sink -> { + // Simulate saving the user data to a database or data store + try { + dataStore.put(user.getId(), user); + sink.success(true); // Database save operation successful + } catch (Exception e) { + sink.success(false); // Database save operation failed + } + }); + } +} + diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java new file mode 100644 index 0000000000..7c33466f24 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java @@ -0,0 +1,29 @@ +package com.baeldung.webflux.zipwhen.service; + +import reactor.core.publisher.Mono; + +//public class EmailService { +// public Mono sendEmail(String userId) { +// //code to send the email +// return Mono.just(true); +// } +//} + + +public class EmailService { + private final UserService userService; + + public EmailService(UserService userService) { + this.userService = userService; + } + + public Mono sendEmail(String userId) { + return userService.getUser(userId) + .flatMap(user -> { + // Code to send the email using the user's information + System.out.println("Sending email to: " + user.getEmail()); + return Mono.just(true); + }) + .defaultIfEmpty(false); + } +} diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java new file mode 100644 index 0000000000..4d5a6448d5 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java @@ -0,0 +1,15 @@ +package com.baeldung.webflux.zipwhen.service; + +import com.baeldung.webflux.zipwhen.model.User; + +import reactor.core.publisher.Mono; + +public class UserService { + public Mono getUser(String userId) { + // Replace with your implementation to validate the user + // and return a Mono with the validated user data + // For example: + return Mono.just(new User(userId, "John Doe")); + } +} + diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java new file mode 100644 index 0000000000..a08f364d90 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java @@ -0,0 +1,44 @@ +package com.baeldung.webflux.zipwhen.web; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +import com.baeldung.webflux.zipwhen.model.User; +import com.baeldung.webflux.zipwhen.service.DatabaseService; +import com.baeldung.webflux.zipwhen.service.EmailService; +import com.baeldung.webflux.zipwhen.service.UserService; + +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; +import reactor.util.function.Tuples; + +public class UserController { + private final UserService userService; + private final EmailService emailService; + private final DatabaseService databaseService; + public UserController(UserService userService, + EmailService emailService, + DatabaseService databaseService) { + this.userService = userService; + this.emailService = emailService; + this.databaseService = databaseService; + } + + @GetMapping("/example/{userId}") + public Mono> combineAllDataFor(@PathVariable String userId) { + Mono userMono = userService.getUser(userId); + Mono emailSentMono = emailService.sendEmail(userId) + .subscribeOn(Schedulers.parallel()); + Mono databaseResultMono = userMono.flatMap(user -> databaseService.saveUserData(user) + .map(Object::toString)); + + return userMono.zipWhen(user -> emailSentMono, Tuples::of) + .zipWhen(tuple -> databaseResultMono, (tuple, databaseResult) -> { + User user = tuple.getT1(); + Boolean emailSent = tuple.getT2(); + return ResponseEntity.ok() + .body("Response: " + user + ", Email Sent: " + emailSent + ", Database Result: " + databaseResult); + }); + } +} diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java new file mode 100644 index 0000000000..69b14f3172 --- /dev/null +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java @@ -0,0 +1,42 @@ +package com.baeldung.webflux.zipwhen; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import com.baeldung.webflux.zipwhen.model.User; +import com.baeldung.webflux.zipwhen.service.DatabaseService; +import com.baeldung.webflux.zipwhen.service.EmailService; +import com.baeldung.webflux.zipwhen.service.UserService; +import com.baeldung.webflux.zipwhen.web.UserController; + +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +public class UserControllerTest { + @Test + public void givenUserId_whenCombineAllData_thenReturnsMonoWithCombinedData() { + UserService userService = Mockito.mock(UserService.class); + EmailService emailService = Mockito.mock(EmailService.class); + DatabaseService databaseService = Mockito.mock(DatabaseService.class); + + String userId = "123"; + User user = new User(userId, "John Doe"); + + Mockito.when(userService.getUser(userId)).thenReturn(Mono.just(user)); + Mockito.when(emailService.sendEmail(userId)).thenReturn(Mono.just(true)); + Mockito.when(databaseService.saveUserData(user)).thenReturn(Mono.just(true)); + + UserController userController = new UserController(userService, emailService, databaseService); + + Mono> responseMono = userController.combineAllDataFor(userId); + + StepVerifier.create(responseMono) + .expectNextMatches(responseEntity -> + responseEntity.getStatusCode() == HttpStatus.OK && + responseEntity.getBody().equals("Response: " + user + ", Email Sent: true, Database Result: " + true) + ) + .verifyComplete(); + } +} From d04a16784016c76eb7c48ec971f8373a4dcae01c Mon Sep 17 00:00:00 2001 From: uzma Date: Wed, 12 Jul 2023 01:26:57 +0100 Subject: [PATCH 002/831] [BAEL-6689] code for zipwhen --- .../zipwhen/service/DatabaseService.java | 17 ++--------------- .../webflux/zipwhen/service/EmailService.java | 9 --------- .../webflux/zipwhen/service/UserService.java | 5 +---- .../webflux/zipwhen/web/UserController.java | 19 +++++++++---------- .../webflux/zipwhen/UserControllerTest.java | 15 ++++++++------- 5 files changed, 20 insertions(+), 45 deletions(-) diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java index b7e7a1aa50..d420646871 100644 --- a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/DatabaseService.java @@ -10,26 +10,13 @@ import reactor.core.publisher.Mono; public class DatabaseService { private Map dataStore = new ConcurrentHashMap<>(); - // public Mono saveUserData(User user) { - // - // - // return Mono.fromRunnable(() -> { - // // Simulate saving the user data to a database or data store - // dataStore.put(user.getId(), user); - // - // - // }); - // } - //} - public Mono saveUserData(User user) { return Mono.create(sink -> { - // Simulate saving the user data to a database or data store try { dataStore.put(user.getId(), user); - sink.success(true); // Database save operation successful + sink.success(true); } catch (Exception e) { - sink.success(false); // Database save operation failed + sink.success(false); } }); } diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java index 7c33466f24..9c0340b7ee 100644 --- a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/EmailService.java @@ -2,14 +2,6 @@ package com.baeldung.webflux.zipwhen.service; import reactor.core.publisher.Mono; -//public class EmailService { -// public Mono sendEmail(String userId) { -// //code to send the email -// return Mono.just(true); -// } -//} - - public class EmailService { private final UserService userService; @@ -20,7 +12,6 @@ public class EmailService { public Mono sendEmail(String userId) { return userService.getUser(userId) .flatMap(user -> { - // Code to send the email using the user's information System.out.println("Sending email to: " + user.getEmail()); return Mono.just(true); }) diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java index 4d5a6448d5..fe602fbc33 100644 --- a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/service/UserService.java @@ -6,10 +6,7 @@ import reactor.core.publisher.Mono; public class UserService { public Mono getUser(String userId) { - // Replace with your implementation to validate the user - // and return a Mono with the validated user data - // For example: - return Mono.just(new User(userId, "John Doe")); + return Mono.just(new User(userId, "john Major")); } } diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java index a08f364d90..dbd89c45d3 100644 --- a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/zipwhen/web/UserController.java @@ -14,16 +14,15 @@ import reactor.core.scheduler.Schedulers; import reactor.util.function.Tuples; public class UserController { - private final UserService userService; - private final EmailService emailService; - private final DatabaseService databaseService; - public UserController(UserService userService, - EmailService emailService, - DatabaseService databaseService) { - this.userService = userService; - this.emailService = emailService; - this.databaseService = databaseService; - } + private final UserService userService; + private final EmailService emailService; + private final DatabaseService databaseService; + + public UserController(UserService userService, EmailService emailService, DatabaseService databaseService) { + this.userService = userService; + this.emailService = emailService; + this.databaseService = databaseService; + } @GetMapping("/example/{userId}") public Mono> combineAllDataFor(@PathVariable String userId) { diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java index 69b14f3172..1d86d5ce99 100644 --- a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java @@ -24,19 +24,20 @@ public class UserControllerTest { String userId = "123"; User user = new User(userId, "John Doe"); - Mockito.when(userService.getUser(userId)).thenReturn(Mono.just(user)); - Mockito.when(emailService.sendEmail(userId)).thenReturn(Mono.just(true)); - Mockito.when(databaseService.saveUserData(user)).thenReturn(Mono.just(true)); + Mockito.when(userService.getUser(userId)) + .thenReturn(Mono.just(user)); + Mockito.when(emailService.sendEmail(userId)) + .thenReturn(Mono.just(true)); + Mockito.when(databaseService.saveUserData(user)) + .thenReturn(Mono.just(true)); UserController userController = new UserController(userService, emailService, databaseService); Mono> responseMono = userController.combineAllDataFor(userId); StepVerifier.create(responseMono) - .expectNextMatches(responseEntity -> - responseEntity.getStatusCode() == HttpStatus.OK && - responseEntity.getBody().equals("Response: " + user + ", Email Sent: true, Database Result: " + true) - ) + .expectNextMatches(responseEntity -> responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() + .equals("Response: " + user + ", Email Sent: true, Database Result: " + true)) .verifyComplete(); } } From af8b296223ea9e151190ba92eb84d9ed344afbe4 Mon Sep 17 00:00:00 2001 From: uzma Date: Wed, 12 Jul 2023 07:41:33 +0100 Subject: [PATCH 003/831] [BAEL-6689] update test name --- .../{UserControllerTest.java => UserControllerUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/{UserControllerTest.java => UserControllerUnitTest.java} (97%) diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerUnitTest.java similarity index 97% rename from spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java rename to spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerUnitTest.java index 1d86d5ce99..8ed4cfb6c6 100644 --- a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerTest.java +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/zipwhen/UserControllerUnitTest.java @@ -14,7 +14,7 @@ import com.baeldung.webflux.zipwhen.web.UserController; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -public class UserControllerTest { +public class UserControllerUnitTest { @Test public void givenUserId_whenCombineAllData_thenReturnsMonoWithCombinedData() { UserService userService = Mockito.mock(UserService.class); From fa06d77df8272afb13814aa500366a6ea45e0e8a Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Mon, 24 Jul 2023 13:17:40 -0700 Subject: [PATCH 004/831] BAEL-5852: What does the Holder do in Java? --- .../main/java/com/baeldung/holder/Holder.java | 9 ++++++ .../com/baeldung/holder/SupplierService.java | 13 ++++++++ .../holder/SupplierServiceUnitTest.java | 31 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java create mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java create mode 100644 core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java new file mode 100644 index 0000000000..da066ee5c6 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java @@ -0,0 +1,9 @@ +package com.baeldung.holder; + +public class Holder { + public T value; + + public Holder(T value) { + this.value = value; + } +} diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java new file mode 100644 index 0000000000..473a4de423 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java @@ -0,0 +1,13 @@ +package com.baeldung.holder; + +public class SupplierService { + public void getSupplierByZipCode(String zip, Holder resultHolder) { + // Let's pretend we did some work here to get the supplier + // And let's say all zip codes starting with "9" are valid, just for this example + if (zip.startsWith("9")) { + resultHolder.value = true; + } else { + resultHolder.value = false; + } + } +} diff --git a/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java new file mode 100644 index 0000000000..e1446fc229 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.holder; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class SupplierServiceUnitTest { + + @Test + public void givenValidZipCode_whenGetSupplierByZipCode_thenTrue() { + SupplierService service = new SupplierService(); + Holder resultHolder = new Holder<>(false); + String zipCode = "98682"; + + service.getSupplierByZipCode(zipCode, resultHolder); + + assertTrue(resultHolder.value); + } + + @Test + public void givenInvalidZipCode_whenGetSupplierByZipCode_thenFalse() { + SupplierService service = new SupplierService(); + Holder resultHolder = new Holder<>(true); + String zipCode = "12345"; + + service.getSupplierByZipCode(zipCode, resultHolder); + + assertFalse(resultHolder.value); + } +} From 183e213f0e14b740fa23c294f1f0304cf492d6fc Mon Sep 17 00:00:00 2001 From: Neetika Khandelwal Date: Thu, 10 Aug 2023 23:11:25 +0530 Subject: [PATCH 005/831] Shallow and Deep Copy example --- .../com/baeldung/shallowdeepcopy/Student.java | 27 +++++++++++++++ .../ShallowDeepCopyExampleTest.java | 34 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java new file mode 100644 index 0000000000..df75db23ac --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java @@ -0,0 +1,27 @@ +package com.baeldung.shallowdeepcopy; + +class Student { + private String name; + private int rollno; + + public Student(String name, int rollno) { + this.name = name; + this.rollno = rollno; + } + + public String getName() { + return name; + } + public int getRollno() { + return rollno; + } + + public void setRollno(int rollno) { + this.rollno = rollno; + } + + public void setName(String name) { + this.name = name; + } +} + diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java new file mode 100644 index 0000000000..68836a96f8 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java @@ -0,0 +1,34 @@ +package com.baeldung.shallowdeepcopy; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +public class ShallowDeepCopyExampleTest { + + @Test + void testShallowCopy() { + Student originalStudent = new Student("John", 20); + Student shallowCopy = originalStudent; + + shallowCopy.setName("Baeldung"); + shallowCopy.setRollno(10); + + assertEquals("Baeldung", originalStudent.getName()); + assertEquals(10, originalStudent.getRollno()); + } + + @Test + void testDeepCopy() { + Student originalStudent = new Student("John", 20); + Student deepCopy = new Student(originalStudent.getName(), originalStudent.getRollno()); + + deepCopy.setName("Baeldung"); + deepCopy.setRollno(10); + + assertEquals("John", originalStudent.getName()); + assertEquals(20, originalStudent.getRollno()); + + assertEquals("Baeldung", deepCopy.getName()); + assertEquals(10, deepCopy.getRollno()); + } +} From 6300c412904f9a36be6f40098ac7f6fa74b38b9b Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 17 Sep 2023 22:36:14 +0530 Subject: [PATCH 006/831] BAEL-6695 Boolean Validation in Spring Boot BAEL-6695 Boolean Validation in Spring Boot --- spring-boot-modules/pom.xml | 1 + .../spring-boot-validations/pom.xml | 38 +++++++ .../main/java/com/baeldung/Application.java | 12 ++ .../controller/ValidationController.java | 19 ++++ .../GlobalExceptionHandler.java | 37 +++++++ .../deserializer/BooleanDeserializer.java | 18 +++ .../java/com/baeldung/dto/BooleanObject.java | 26 +++++ .../baeldung/service/ValidationService.java | 17 +++ .../ValidationControllerUnitTest.java | 104 ++++++++++++++++++ .../com/baeldung/dto/BooleanUnitTest.java | 28 +++++ .../service/ValidationServiceUnitTest.java | 35 ++++++ 11 files changed, 335 insertions(+) create mode 100644 spring-boot-modules/spring-boot-validations/pom.xml create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/Application.java create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java create mode 100644 spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java create mode 100644 spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java create mode 100644 spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java create mode 100644 spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 1c4b2bb38f..e0afbbddaf 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -104,6 +104,7 @@ spring-boot-springdoc-2 spring-boot-documentation spring-boot-3-url-matching + spring-boot-validations diff --git a/spring-boot-modules/spring-boot-validations/pom.xml b/spring-boot-modules/spring-boot-validations/pom.xml new file mode 100644 index 0000000000..e89c7f997b --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/pom.xml @@ -0,0 +1,38 @@ + + 4.0.0 + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + spring-boot-validations + spring-boot-validations + Demo of Validations in Spring Boot + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-validation + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/Application.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..c0490d50c6 --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/Application.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java new file mode 100644 index 0000000000..8597c9617c --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java @@ -0,0 +1,19 @@ +package com.baeldung.controller; + +import javax.validation.Valid; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.dto.BooleanObject; + +@RestController +public class ValidationController { + + @PostMapping("/validateBoolean") + public ResponseEntity addUser(@RequestBody @Valid BooleanObject booleanObj) { + return ResponseEntity.ok("BooleanObject is valid"); + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java new file mode 100644 index 0000000000..601da40e23 --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java @@ -0,0 +1,37 @@ +package com.baeldung.controlleradvice; + +import java.util.stream.Collectors; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import com.fasterxml.jackson.databind.exc.InvalidFormatException; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + public String handleValidationException(MethodArgumentNotValidException ex) { + return ex.getBindingResult() + .getFieldErrors() + .stream() + .map(e -> e.getDefaultMessage()) + .collect(Collectors.joining(",")); + } + + @ExceptionHandler(IllegalArgumentException.class) + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + public String handleIllegalArugmentException(IllegalArgumentException ex) { + return ex.getMessage(); + } + + @ExceptionHandler(InvalidFormatException.class) + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + public String handleInvalidFormatException(InvalidFormatException ex) { + return ex.getOriginalMessage(); + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java new file mode 100644 index 0000000000..c9f30dc6e3 --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java @@ -0,0 +1,18 @@ +package com.baeldung.deserializer; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +public class BooleanDeserializer extends JsonDeserializer { + @Override + public Boolean deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String value = p.getText(); + if (value != null && !value.equals("TRUE") && !value.equals("FALSE")) { + throw new IllegalArgumentException("Boolean value must come as Capital TRUE or FALSE"); + } + return Boolean.valueOf(value); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java new file mode 100644 index 0000000000..77ca18b02c --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java @@ -0,0 +1,26 @@ +package com.baeldung.dto; + +import javax.validation.constraints.AssertFalse; +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; + +import com.baeldung.deserializer.BooleanDeserializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import lombok.Data; + +@Data +public class BooleanObject { + + @NotNull(message = "boolField cannot be null") + Boolean boolField; + + @AssertTrue(message = "trueField must have true value") + Boolean trueField; + + @AssertFalse(message = "falseField must have false value") + Boolean falseField; + + @JsonDeserialize(using = BooleanDeserializer.class) + Boolean boolStringVar; +} diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java new file mode 100644 index 0000000000..5b96344e46 --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java @@ -0,0 +1,17 @@ +package com.baeldung.service; + +import javax.validation.Valid; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import com.baeldung.dto.BooleanObject; + +@Service +@Validated +public class ValidationService { + + public void validateBoolean(@Valid BooleanObject booleanObj) { + // further processing + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java new file mode 100644 index 0000000000..78950e4c0e --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -0,0 +1,104 @@ +package com.baeldung.controller; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.dto.BooleanObject; +import com.fasterxml.jackson.databind.ObjectMapper; + +@ExtendWith(SpringExtension.class) +@WebMvcTest(controllers = ValidationController.class) +class ValidationControllerUnitTest { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + + @Test + void testNullBoolean() throws Exception { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(null); + String postBody = objectMapper.writeValueAsString(boolObj); + + mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andExpect(status().isBadRequest()); + + } + + @Test + void testTrueBoolean() throws Exception { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(Boolean.TRUE); + boolObj.setTrueField(Boolean.FALSE); + String postBody = objectMapper.writeValueAsString(boolObj); + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("trueField must have true value", output); + } + + @Test + void testFalseBoolean() throws Exception { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(Boolean.TRUE); + boolObj.setTrueField(Boolean.TRUE); + boolObj.setFalseField(Boolean.TRUE); + String postBody = objectMapper.writeValueAsString(boolObj); + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("falseField must have false value", output); + } + + @Test + void testBooleanFromString() throws Exception { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(Boolean.TRUE); + boolObj.setTrueField(Boolean.TRUE); + boolObj.setFalseField(Boolean.FALSE); + boolObj.setBoolStringVar(true); + String postBody = objectMapper.writeValueAsString(boolObj); + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("Boolean value must come as Capital TRUE or FALSE", output); + } + + @Test + void testValidBean() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"TRUE\"}"; + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("BooleanObject is valid", output); + + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java new file mode 100644 index 0000000000..8c9375e72f --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.dto; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class BooleanUnitTest { + + @Test + void testBooleanFromString() { + Boolean trueVar = Boolean.valueOf("TRUE"); + Boolean falseVar = Boolean.valueOf("false"); + Boolean parsedVar = Boolean.parseBoolean("True"); + + assertEquals(Boolean.TRUE, trueVar); + assertEquals(Boolean.FALSE, falseVar); + assertEquals(Boolean.TRUE, parsedVar); + } + + @Test + void testBoolean() { + Boolean trueVar = Boolean.valueOf(true); + Boolean falseVar = Boolean.valueOf(false); + + assertEquals(Boolean.TRUE, trueVar); + assertEquals(Boolean.FALSE, falseVar); + } +} diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java new file mode 100644 index 0000000000..c67acea13d --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.service; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import javax.validation.ConstraintViolationException; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.dto.BooleanObject; + +@ExtendWith(SpringExtension.class) +@SpringBootTest +class ValidationServiceUnitTest { + + @Autowired + ValidationService service; + + @Test + void validateBoolean() { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(Boolean.valueOf(true)); + boolObj.setTrueField(Boolean.FALSE); + Throwable throwableError = assertThrows(ConstraintViolationException.class, () -> { + service.validateBoolean(boolObj); + }); + assertTrue(throwableError.getLocalizedMessage() + .endsWith("trueField must have true value")); + } + +} From c07c35882fdeadb4695835b305e309d80414565e Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 17 Sep 2023 23:10:10 +0530 Subject: [PATCH 007/831] Removing unused ExceptionHandler --- .../baeldung/controlleradvice/GlobalExceptionHandler.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java index 601da40e23..4c696cb70d 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java @@ -8,8 +8,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; -import com.fasterxml.jackson.databind.exc.InvalidFormatException; - @RestControllerAdvice public class GlobalExceptionHandler { @@ -29,9 +27,4 @@ public class GlobalExceptionHandler { return ex.getMessage(); } - @ExceptionHandler(InvalidFormatException.class) - @ResponseStatus(value = HttpStatus.BAD_REQUEST) - public String handleInvalidFormatException(InvalidFormatException ex) { - return ex.getOriginalMessage(); - } } From 0bb7a8db27e93e108459f1c9baa340a898a23176 Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Sun, 17 Sep 2023 21:57:35 -0700 Subject: [PATCH 008/831] BAEL-5755: Convert an XML file to CSV file --- .../baeldung/xml/xml2csv/Xml2CsvExample.java | 113 +++++++++++++ xml/src/main/resources/xml2csv/data.xml | 26 +++ xml/src/main/resources/xml2csv/style.xsl | 21 +++ .../xml/xml2csv/Xml2CsvExampleUnitTest.java | 155 ++++++++++++++++++ 4 files changed, 315 insertions(+) create mode 100644 xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java create mode 100644 xml/src/main/resources/xml2csv/data.xml create mode 100644 xml/src/main/resources/xml2csv/style.xsl create mode 100644 xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java diff --git a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java new file mode 100644 index 0000000000..d2acafc881 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java @@ -0,0 +1,113 @@ +package com.baeldung.xml.xml2csv; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +public class Xml2CsvExample { + + private static final String BASE_PATH = "xml/src/main/resources/xml2csv/"; + + private static final String STYLE_XSL = BASE_PATH + "style.xsl"; + private static final String DATA_XML = BASE_PATH + "data.xml"; + private static final String OUTPUT_CSV_XSTL = BASE_PATH + "output_xstl.csv"; + private static final String OUTPUT_CSV_STAX = BASE_PATH + "output_stax.csv"; + + public static void main(String[] args) { + try { + convertXml2CsvXslt(STYLE_XSL, DATA_XML, OUTPUT_CSV_XSTL); + convertXml2CsvStax(DATA_XML, OUTPUT_CSV_STAX); + } catch (IOException | TransformerException e) { + e.printStackTrace(); + } + } + + protected static void convertXml2CsvXslt(String xslPath, String xmlPath, String csvPath) throws IOException, TransformerException { + StreamSource styleSource = new StreamSource(new File(xslPath)); + Transformer transformer = TransformerFactory.newInstance() + .newTransformer(styleSource); + Source source = new StreamSource(new File(xmlPath)); + Result outputTarget = new StreamResult(new File(csvPath)); + transformer.transform(source, outputTarget); + } + + protected static void convertXml2CsvStax(String xmlFilePath, String csvFilePath) throws IOException, TransformerException { + XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + + try (InputStream in = Files.newInputStream(Paths.get(xmlFilePath)); BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath))) { + + // Write header to CSV + writer.write("bookstore_id,book_id,category,title,author_id,author_name,price\n"); + + XMLStreamReader reader = inputFactory.createXMLStreamReader(in); + + String currentElement; + StringBuilder csvRow = new StringBuilder(); + StringBuilder bookstoreInfo = new StringBuilder(); + + while (reader.hasNext()) { + int eventType = reader.next(); + + switch (eventType) { + case XMLStreamConstants.START_ELEMENT: + currentElement = reader.getLocalName(); + if ("Bookstore".equals(currentElement)) { + bookstoreInfo.setLength(0); // clear previous bookstore info + bookstoreInfo.append(reader.getAttributeValue(null, "id")) + .append(","); + } + if ("Book".equals(currentElement)) { + csvRow.append(bookstoreInfo) + .append(reader.getAttributeValue(null, "id")) + .append(",") + .append(reader.getAttributeValue(null, "category")) + .append(","); + } + if ("Author".equals(currentElement)) { + csvRow.append(reader.getAttributeValue(null, "id")) + .append(","); + } + break; + + case XMLStreamConstants.CHARACTERS: + if (!reader.isWhiteSpace()) { + csvRow.append(reader.getText() + .trim()) + .append(","); + } + break; + + case XMLStreamConstants.END_ELEMENT: + if ("Book".equals(reader.getLocalName())) { + // remove the last comma and add a newline + csvRow.setLength(csvRow.length() - 1); + csvRow.append("\n"); + writer.write(csvRow.toString()); + + // Reset the StringBuilder for the next row + csvRow.setLength(0); + } + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/xml/src/main/resources/xml2csv/data.xml b/xml/src/main/resources/xml2csv/data.xml new file mode 100644 index 0000000000..385fcf661c --- /dev/null +++ b/xml/src/main/resources/xml2csv/data.xml @@ -0,0 +1,26 @@ + + + + + + Death and the Penguin + Andrey Kurkov + 10.99 + + + Kobzar + Taras Shevchenko + 8.50 + + + + + + + Voroshilovgrad + Serhiy Zhadan + 12.99 + + + + diff --git a/xml/src/main/resources/xml2csv/style.xsl b/xml/src/main/resources/xml2csv/style.xsl new file mode 100644 index 0000000000..ea23880092 --- /dev/null +++ b/xml/src/main/resources/xml2csv/style.xsl @@ -0,0 +1,21 @@ + + + + + bookstore_id,book_id,category,title,author_id,author_name,price + + + + + + + + + + + + + + + + diff --git a/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java b/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java new file mode 100644 index 0000000000..3fa44b427c --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java @@ -0,0 +1,155 @@ +package com.baeldung.xml.xml2csv; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.xml.transform.TransformerException; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +public class Xml2CsvExampleUnitTest { + + private static final String BASE_PATH = "src/main/resources/xml2csv/"; + + private static final String STYLE_XSL = BASE_PATH + "style.xsl"; + private static final String DATA_XML = BASE_PATH + "data.xml"; + private static final String TEMP_OUTPUT_CSV = BASE_PATH + "tempOutput.xml"; + + @AfterEach + public void teardown() { + new File(TEMP_OUTPUT_CSV).delete(); + } + + @Test + public void whenConvertXml2CsvXslt_thenCsvFileIsCreated() throws IOException, TransformerException { + Xml2CsvExample.convertXml2CsvXslt(STYLE_XSL, DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + assertTrue(csvFile.exists()); + } + + @Test + public void whenConvertXml2CsvStax_thenCsvFileIsCreated() throws IOException, TransformerException { + Xml2CsvExample.convertXml2CsvStax(DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + assertTrue(csvFile.exists()); + } + + @Test + public void whenConvertXml2CsvXslt_thenCsvFileIsNotEmpty() throws IOException, TransformerException { + Xml2CsvExample.convertXml2CsvXslt(STYLE_XSL, DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + BufferedReader reader = new BufferedReader(new FileReader(csvFile)); + String firstLine = reader.readLine(); + assertNotNull(firstLine); + assertFalse(firstLine.isEmpty()); + + reader.close(); + } + + @Test + public void whenConvertXml2CsvStax_thenCsvFileIsNotEmpty() throws IOException, TransformerException { + Xml2CsvExample.convertXml2CsvStax(DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + BufferedReader reader = new BufferedReader(new FileReader(csvFile)); + String firstLine = reader.readLine(); + assertNotNull(firstLine); + assertFalse(firstLine.isEmpty()); + + reader.close(); + } + + @Test + public void whenConvertXml2CsvXsltWithWrongXSL_thenThrowsException() { + String xslWrongPath = BASE_PATH + "wrongFile.xsl"; + + assertThrows(TransformerException.class, () -> Xml2CsvExample.convertXml2CsvXslt(xslWrongPath, DATA_XML, TEMP_OUTPUT_CSV)); + } + + @Test + public void whenConvertXml2CsvXslt_thenCsvMatchesPattern() throws IOException, TransformerException { + String headerPattern = "^bookstore_id,book_id,category,title,author_id,author_name,price$"; + String dataPattern = "^[A-Z0-9]+,[A-Z0-9]+,[a-zA-Z]+,[a-zA-Z0-9\\s]+,[A-Z0-9]+,[a-zA-Z\\s]+,\\d+(\\.\\d{2})?$"; + + Xml2CsvExample.convertXml2CsvXslt(STYLE_XSL, DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + try(BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { + String line; + boolean isFirstLine = true; + while ((line = reader.readLine()) != null) { + if (isFirstLine) { + assertTrue(line.matches(headerPattern), "Header does not match pattern"); + isFirstLine = false; + } else { + assertTrue(line.matches(dataPattern), "Data line does not match pattern"); + } + } + } + } + + @Test + public void whenConvertXml2Stax_thenCsvMatchesPattern() throws IOException, TransformerException { + String headerPattern = "^bookstore_id,book_id,category,title,author_id,author_name,price$"; + String dataPattern = "^[A-Z0-9]+,[A-Z0-9]+,[a-zA-Z]+,[a-zA-Z0-9\\s]+,[A-Z0-9]+,[a-zA-Z\\s]+,\\d+(\\.\\d{2})?$"; + + Xml2CsvExample.convertXml2CsvStax(DATA_XML, TEMP_OUTPUT_CSV); + + File csvFile = new File(TEMP_OUTPUT_CSV); + try(BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { + String line; + boolean isFirstLine = true; + while ((line = reader.readLine()) != null) { + if (isFirstLine) { + assertTrue(line.matches(headerPattern), "Header does not match pattern"); + isFirstLine = false; + } else { + assertTrue(line.matches(dataPattern), "Data line does not match pattern"); + } + } + } + } + + @Test + public void whenConcurrentConversion_thenNoErrors() throws InterruptedException { + int numThreads = 10; + ExecutorService service = Executors.newFixedThreadPool(numThreads); + CountDownLatch latch = new CountDownLatch(numThreads); + + for (int i = 0; i < numThreads; i++) { + final int threadId = i; + service.execute(() -> { + String threadSpecificOutputCsv = BASE_PATH + "tempOutput" + threadId + ".csv"; + try { + Xml2CsvExample.convertXml2CsvXslt(STYLE_XSL, DATA_XML, threadSpecificOutputCsv); + assertTrue(Files.exists(Paths.get(threadSpecificOutputCsv)), "File should exist"); + } catch (IOException | TransformerException e) { + fail("Exception should not be thrown: " + e.getMessage()); + } finally { + new File(threadSpecificOutputCsv).delete(); + latch.countDown(); + } + }); + } + + latch.await(); + } + +} From 6bc892a6bddc663c55e83bf2aa6b67fcdea0d47c Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 20 Sep 2023 18:17:40 -0300 Subject: [PATCH 009/831] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..d6d5d3c8fe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. From 601d051f32e0745819ee0d781d882d9927e4e3db Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 22 Sep 2023 22:30:54 +0530 Subject: [PATCH 010/831] Student.java --- .../com/baeldung/shallowdeepcopy/Student.java | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java index df75db23ac..a3f726b64b 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java @@ -1,27 +1,16 @@ package com.baeldung.shallowdeepcopy; -class Student { - private String name; - private int rollno; - - public Student(String name, int rollno) { - this.name = name; +class Student { + private String name; + private int age; + private School school; + public Student(String name, int age, School school) { + this.name = name; this.rollno = rollno; - } - - public String getName() { - return name; - } - public int getRollno() { - return rollno; - } - - public void setRollno(int rollno) { - this.rollno = rollno; - } - - public void setName(String name) { - this.name = name; - } + this.school = school; + } + public Student(Student st) { + this(st.getName(), st.getAge(), st.getSchool()); + } // standard getters and setters } From fc07da9edae917f0c8e6f2f0ebc42d78db203a3c Mon Sep 17 00:00:00 2001 From: Neetika KHANDELWAL Date: Fri, 22 Sep 2023 23:06:36 +0530 Subject: [PATCH 011/831] Modified code for Test --- .../com/baeldung/shallowdeepcopy/School.java | 22 ++++++++ .../com/baeldung/shallowdeepcopy/Student.java | 33 ++++++++---- .../ShallowDeepCopyExampleTest.java | 53 +++++++++++-------- 3 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java new file mode 100644 index 0000000000..28a751741e --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java @@ -0,0 +1,22 @@ +package com.baeldung.shallowdeepcopy; + +class School { + private String schoolName; + public School(School sc) { + this(sc.getSchoolName()); + } + public School(String schoolName) { + this.schoolName = schoolName; + } + // standard getters and setters +} + +@Override +public Object clone() { + try { + return (School) super.clone(); + } catch (CloneNotSupportedException e) { + return new School(this.getSchoolName()); + } +} + diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java index a3f726b64b..2fc34ba709 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java @@ -1,16 +1,27 @@ package com.baeldung.shallowdeepcopy; class Student { - private String name; - private int age; - private School school; - public Student(String name, int age, School school) { - this.name = name; - this.rollno = rollno; - this.school = school; - } - public Student(Student st) { - this(st.getName(), st.getAge(), st.getSchool()); - } // standard getters and setters + private String name; + private int age; + private School school; + public Student(String name, int age, School school) { + this.name = name; + this.rollno = rollno; + this.school = school; + } + public Student(Student st) { + this(st.getName(), st.getAge(), st.getSchool()); + } // standard getters and setters } +@Override +public Object clone() { + Student student = null; + try { + student = (Student) super.clone(); + } catch (CloneNotSupportedException e) { + student = new Student(this.getName(), this.getAge(), this.getSchool()); + } + student.school= (School) this.school.clone(); + return student; +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java index 68836a96f8..a14a621dcc 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java @@ -4,31 +4,38 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; public class ShallowDeepCopyExampleTest { + + @Test + public void whenPerformShallowCopy_thenObjectsNotSame() { + School school = new School("Baeldung School"); + Student originalStudent = new Student("John", 20, school); + Student shallowCopy = new Student(originalStudent.getName(), originalStudent.getAge(), originalStudent.getSchool()); + assertNotSame(shallowCopy, originalStudent); + } + + @Test public void whenModifyingActualObject_thenCopyAlsoChange() { + School school = new School("Baeldung School"); + Student originalStudent = new Student("John", 20, school); + Student shallowCopy = new Student(originalStudent.getName(), originalStudent.getAge(), originalStudent.getSchool()); + school.setSchoolName("New Baeldung School"); + assertEquals(shallowCopy.getSchool().getSchoolName(), originalStudent.getSchool().getSchoolName()); + } @Test - void testShallowCopy() { - Student originalStudent = new Student("John", 20); - Student shallowCopy = originalStudent; + public void whenModifyingActualObject_thenCloneCopyNotChange() { + School school = new School("New School"); + Student originalStudent = new Student("Alice", 10, school); + Student deepCopy = (Student) originalStudent.clone(); + school.setSchoolName("New Baeldung School"); + assertNotEquals(deepCopy.getSchool().getSchoolName(), originalStudent.getSchool().getSchoolName()); + } - shallowCopy.setName("Baeldung"); - shallowCopy.setRollno(10); - - assertEquals("Baeldung", originalStudent.getName()); - assertEquals(10, originalStudent.getRollno()); - } - - @Test - void testDeepCopy() { - Student originalStudent = new Student("John", 20); - Student deepCopy = new Student(originalStudent.getName(), originalStudent.getRollno()); - - deepCopy.setName("Baeldung"); - deepCopy.setRollno(10); - - assertEquals("John", originalStudent.getName()); - assertEquals(20, originalStudent.getRollno()); - - assertEquals("Baeldung", deepCopy.getName()); - assertEquals(10, deepCopy.getRollno()); + @Test + public void whenModifyingActualObject_thenCopyNotChange() { + School school = new School("Baeldung School"); + Student originalStudent = new Student("Alice", 30, school); + Student deepCopy = new Student(originalStudent); + school.setSchoolName("New Baeldung School"); + assertNotEquals( originalStudent.getSchool().getSchoolName(), deepCopy.getSchool().getSchoolName()); } } From c8c573899fd16d47f2388313656137551a704862 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 24 Sep 2023 01:20:56 +0530 Subject: [PATCH 012/831] Review comments --- .../deserializer/BooleanDeserializer.java | 13 ++++++++----- .../ValidationControllerUnitTest.java | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java index c9f30dc6e3..5b50b75675 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java @@ -8,11 +8,14 @@ import com.fasterxml.jackson.databind.JsonDeserializer; public class BooleanDeserializer extends JsonDeserializer { @Override - public Boolean deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - String value = p.getText(); - if (value != null && !value.equals("TRUE") && !value.equals("FALSE")) { - throw new IllegalArgumentException("Boolean value must come as Capital TRUE or FALSE"); + public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException { + String value = parser.getText(); + if (value != null && (value.equals("TRUE") || value.equals("1") || value.equals("+"))) { + return Boolean.TRUE; + } else if (value != null && (value.equals("FALSE") || value.equals("0") || value.equals("-"))) { + return Boolean.FALSE; + } else { + throw new IllegalArgumentException("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0"); } - return Boolean.valueOf(value); } } \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index 78950e4c0e..0ff786bd4c 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -84,7 +84,22 @@ class ValidationControllerUnitTest { .getResponse() .getContentAsString(); - assertEquals("Boolean value must come as Capital TRUE or FALSE", output); + assertEquals("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0", output); + } + + @Test + void testInvalidBooleanFromJson() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"6\"}"; + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0", output); + } @Test From 96ff2a982aad1455dc663936346126605c87e4d2 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 24 Sep 2023 02:08:16 +0530 Subject: [PATCH 013/831] Updated Test case --- .../com/baeldung/controller/ValidationControllerUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index 0ff786bd4c..f312e1259c 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -105,7 +105,7 @@ class ValidationControllerUnitTest { @Test void testValidBean() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"TRUE\"}"; + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) From ece337978c545f2cf826aec7a90765ff61426e4e Mon Sep 17 00:00:00 2001 From: Ashley Frieze Date: Sat, 23 Sep 2023 22:17:39 +0100 Subject: [PATCH 014/831] BAEL-7006 Create example code for environment variables article --- testing-modules/testing-libraries-2/pom.xml | 32 +++++++++++++++- ...ronmentVariablesByAbstractionUnitTest.java | 38 +++++++++++++++++++ ...entVariablesSetByJUnitPioneerUnitTest.java | 22 +++++++++++ ...vironmentVariablesSetDirectlyUnitTest.java | 31 +++++++++++++++ ...ironmentVariablesSystemLambdaUnitTest.java | 18 +++++++++ ...vironmentVariablesSystemRulesUnitTest.java | 23 +++++++++++ ...entVariablesSystemStubsJUnit4UnitTest.java | 18 +++++++++ ...entVariablesSystemStubsJUnit5UnitTest.java | 27 +++++++++++++ ...rameworkClassScopeEnvironmentUnitTest.java | 28 ++++++++++++++ ...riablesSystemStubsNoFrameworkUnitTest.java | 17 +++++++++ ...entVariablesSystemStubsTestNGUnitTest.java | 27 +++++++++++++ 11 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetByJUnitPioneerUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemLambdaUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemRulesUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit4UnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit5UnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkClassScopeEnvironmentUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkUnitTest.java create mode 100644 testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml index 4cc3ea8428..b436b087f8 100644 --- a/testing-modules/testing-libraries-2/pom.xml +++ b/testing-modules/testing-libraries-2/pom.xml @@ -53,6 +53,30 @@ ${system-stubs.version} test + + uk.org.webcompere + system-stubs-testng + ${system-stubs.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.junit-pioneer + junit-pioneer + ${junit.pioneer.version} + test + + + org.testng + testng + ${testng.version} + test + @@ -127,6 +151,9 @@ --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED + + YES + @@ -142,7 +169,10 @@ 0.8.6 1.19.0 1.0.0 - 1.1.0 + 2.1.2 + 7.8.0 + 3.24.2 + 2.1.0 \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java new file mode 100644 index 0000000000..b54fb6d24c --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class EnvironmentVariablesByAbstractionUnitTest { + + @FunctionalInterface + interface GetEnv { + String get(String name); + } + + static class ReadsEnvironment { + private GetEnv getEnv; + + public ReadsEnvironment(GetEnv getEnv) { + this.getEnv = getEnv; + } + + public String whatOs() { + return getEnv.get("OS"); + } + } + + @Test + void givenFakeOs_thenCanReadIt() { + Map fakeEnv = new HashMap<>(); + fakeEnv.put("OS", "MacDowsNix"); + + ReadsEnvironment reader = new ReadsEnvironment(fakeEnv::get); + assertThat(reader.whatOs()) + .isEqualTo("MacDowsNix"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetByJUnitPioneerUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetByJUnitPioneerUnitTest.java new file mode 100644 index 0000000000..02081a6598 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetByJUnitPioneerUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ClearEnvironmentVariable; +import org.junitpioneer.jupiter.SetEnvironmentVariable; + +import static org.assertj.core.api.Assertions.assertThat; + +@SetEnvironmentVariable(key = "pioneer", value = "is pioneering") +class EnvironmentVariablesSetByJUnitPioneerUnitTest { + + @Test + void givenEnvironmentVariableIsSetForClass_thenVariableCanBeRead() { + assertThat(System.getenv("pioneer")).isEqualTo("is pioneering"); + } + + @ClearEnvironmentVariable(key = "pioneer") + @Test + void givenEnvironmentVariableIsClear_thenItIsNotSet() { + assertThat(System.getenv("pioneer")).isNull(); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java new file mode 100644 index 0000000000..7cc661e976 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.Map; +import static org.assertj.core.api.Assertions.assertThat; + +// This test can only work well in Java 15 and below +class EnvironmentVariablesSetDirectlyUnitTest { + @BeforeAll + static void beforeAll() throws Exception { + Class classOfMap = System.getenv().getClass(); + Field field = classOfMap.getDeclaredField("m"); + field.setAccessible(true); + Map writeableEnvironmentVariables = (Map)field.get(System.getenv()); + + writeableEnvironmentVariables.put("baeldung", "has set an environment variable"); + } + + @Test + void givenEnvironmentVariableWasSet_thenCanReadIt() { + assertThat(System.getenv("baeldung")).isEqualTo("has set an environment variable"); + } + + @Test + void givenEnvironmentVariableSetBySurefire_thenCanReadIt() { + assertThat(System.getenv("SET_BY_SUREFIRE")).isEqualTo("YES"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemLambdaUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemLambdaUnitTest.java new file mode 100644 index 0000000000..050bebddfd --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemLambdaUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.Test; + +import static com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable; + +import static org.assertj.core.api.Assertions.assertThat; + +class EnvironmentVariablesSystemLambdaUnitTest { + + @Test + void givenSetEnvironmentVariablesInTest_thenCanBeRead() throws Exception { + withEnvironmentVariable("system lambda", "in test") + .execute(() -> { + assertThat(System.getenv("system lambda")).isEqualTo("in test"); + }); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemRulesUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemRulesUnitTest.java new file mode 100644 index 0000000000..44ebb1be71 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemRulesUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.contrib.java.lang.system.EnvironmentVariables; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EnvironmentVariablesSystemRulesUnitTest { + @Rule + public EnvironmentVariables environmentVariablesRule = new EnvironmentVariables(); + + @Before + public void before() { + environmentVariablesRule.set("system rules", "works"); + } + + @Test + public void givenEnvironmentVariable_thenCanReadIt() { + assertThat(System.getenv("system rules")).isEqualTo("works"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit4UnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit4UnitTest.java new file mode 100644 index 0000000000..efb0ba5598 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit4UnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.Rule; +import org.junit.Test; +import uk.org.webcompere.systemstubs.rules.EnvironmentVariablesRule; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EnvironmentVariablesSystemStubsJUnit4UnitTest { + @Rule + public EnvironmentVariablesRule environmentVariablesRule = + new EnvironmentVariablesRule("system stubs", "initializes variable"); + + @Test + public void givenEnvironmentSetUpInObject_thenCanReadIt() { + assertThat(System.getenv("system stubs")).isEqualTo("initializes variable"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit5UnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit5UnitTest.java new file mode 100644 index 0000000000..1304e4921a --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsJUnit5UnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.environmentvariablesfortest; + + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(SystemStubsExtension.class) +class EnvironmentVariablesSystemStubsJUnit5UnitTest { + + @SystemStub + private EnvironmentVariables environmentVariables; + + @BeforeEach + void beforeEach() { + environmentVariables.set("systemstubs", "creates stub objects"); + } + + @Test + void givenEnvironmentVariableHasBeenSet_thenCanReadIt() { + assertThat(System.getenv("systemstubs")).isEqualTo("creates stub objects"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkClassScopeEnvironmentUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkClassScopeEnvironmentUnitTest.java new file mode 100644 index 0000000000..9e9421c3f1 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkClassScopeEnvironmentUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; + +import static org.assertj.core.api.Assertions.assertThat; + +class EnvironmentVariablesSystemStubsNoFrameworkClassScopeEnvironmentUnitTest { + private static EnvironmentVariables environmentVariables = new EnvironmentVariables(); + + @BeforeAll + static void beforeAll() throws Exception { + environmentVariables.set("system stubs", "in test"); + environmentVariables.setup(); + } + + @AfterAll + static void afterAll() throws Exception { + environmentVariables.teardown(); + } + + @Test + void givenSetEnvironmentVariablesBeforeAll_thenCanBeRead() throws Exception { + assertThat(System.getenv("system stubs")).isEqualTo("in test"); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkUnitTest.java new file mode 100644 index 0000000000..2e7a92b85f --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsNoFrameworkUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.environmentvariablesfortest; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static uk.org.webcompere.systemstubs.SystemStubs.withEnvironmentVariables; + +class EnvironmentVariablesSystemStubsNoFrameworkUnitTest { + + @Test + void givenSetEnvironmentVariablesInTest_thenCanBeRead() throws Exception { + withEnvironmentVariables("system stubs", "in test") + .execute(() -> { + assertThat(System.getenv("system stubs")).isEqualTo("in test"); + }); + } +} diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java new file mode 100644 index 0000000000..e78c8be826 --- /dev/null +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.environmentvariablesfortest; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Listeners; +import org.testng.annotations.Test; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.testng.SystemStub; +import uk.org.webcompere.systemstubs.testng.SystemStubsListener; +import static org.assertj.core.api.Assertions.assertThat; + +@Listeners(SystemStubsListener.class) +public class EnvironmentVariablesSystemStubsTestNGUnitTest { + @SystemStub + private EnvironmentVariables setEnvironment; + + @BeforeClass + public void beforeAll() { + setEnvironment.set("testng", "has environment variables"); + } + + @Test + public void givenEnvironmentVariableWasSet_thenItCanBeRead() { + assertThat(System.getenv("testng")) + .isEqualTo("has environment variables"); + } + +} From 222f5045f1b8598fb936dd804c7bf2911d1e5033 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 25 Sep 2023 12:44:22 +0300 Subject: [PATCH 015/831] [JAVA-12183] Upgraded restx to latest version(1.0.0-rc3) and moved it to jdk9-and-above profile --- web-modules/restx/md.restx.json | 6 +++--- web-modules/restx/pom.xml | 5 ++--- web-modules/restx/src/main/java/restx/demo/AppModule.java | 8 ++++---- web-modules/restx/src/main/java/restx/demo/AppServer.java | 8 ++++---- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/web-modules/restx/md.restx.json b/web-modules/restx/md.restx.json index c87244001c..54a1b4e9f8 100644 --- a/web-modules/restx/md.restx.json +++ b/web-modules/restx/md.restx.json @@ -3,8 +3,8 @@ "packaging": "war", "properties": { - "java.version": "1.8", - "restx.version": "0.35-rc4" + "java.version": "17", + "restx.version": "1.0.0-rc3" }, "fragments": { "maven": [ @@ -24,7 +24,7 @@ "io.restx:restx-i18n-admin:${restx.version}", "io.restx:restx-stats-admin:${restx.version}", "io.restx:restx-servlet:${restx.version}", - "io.restx:restx-server-jetty8:${restx.version}!optional", + "io.restx:restx-server-jetty11:${restx.version}!optional", "io.restx:restx-apidocs:${restx.version}", "io.restx:restx-specs-admin:${restx.version}", "io.restx:restx-admin:${restx.version}", diff --git a/web-modules/restx/pom.xml b/web-modules/restx/pom.xml index 0e6cb3fa78..f75292a4a4 100644 --- a/web-modules/restx/pom.xml +++ b/web-modules/restx/pom.xml @@ -77,7 +77,7 @@ io.restx - restx-server-jetty8 + restx-server-jetty11 ${restx.version} true @@ -137,8 +137,7 @@ - 0.35-rc4 - 1.6.0 + 1.0.0-rc3 \ No newline at end of file diff --git a/web-modules/restx/src/main/java/restx/demo/AppModule.java b/web-modules/restx/src/main/java/restx/demo/AppModule.java index 26bc681481..b47f8b9aa8 100644 --- a/web-modules/restx/src/main/java/restx/demo/AppModule.java +++ b/web-modules/restx/src/main/java/restx/demo/AppModule.java @@ -3,13 +3,13 @@ package restx.demo; import restx.config.ConfigLoader; import restx.config.ConfigSupplier; import restx.factory.Provides; +import restx.security.*; +import restx.factory.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Charsets; import com.google.common.collect.ImmutableSet; -import restx.security.*; -import restx.factory.Module; -import restx.factory.Provides; + import javax.inject.Named; import java.nio.file.Paths; @@ -30,7 +30,7 @@ public class AppModule { @Provides public ConfigSupplier appConfigSupplier(ConfigLoader configLoader) { // Load settings.properties in restx.demo package as a set of config entries - return configLoader.fromResource("restx/demo/settings"); + return configLoader.fromResource("web-modules/restx/demo/settings"); } @Provides diff --git a/web-modules/restx/src/main/java/restx/demo/AppServer.java b/web-modules/restx/src/main/java/restx/demo/AppServer.java index d66aadac68..7275047e0b 100644 --- a/web-modules/restx/src/main/java/restx/demo/AppServer.java +++ b/web-modules/restx/src/main/java/restx/demo/AppServer.java @@ -2,7 +2,7 @@ package restx.demo; import com.google.common.base.Optional; import restx.server.WebServer; -import restx.server.Jetty8WebServer; +import restx.server.Jetty11WebServer; /** * This class can be used to run the app. @@ -12,12 +12,12 @@ import restx.server.Jetty8WebServer; * Reading the port from system env PORT makes it compatible with heroku. */ public class AppServer { - public static final String WEB_INF_LOCATION = "src/main/webapp/WEB-INF/web.xml"; - public static final String WEB_APP_LOCATION = "src/main/webapp"; + public static final String WEB_INF_LOCATION = "web-modules/restx/src/main/webapp/WEB-INF/web.xml"; + public static final String WEB_APP_LOCATION = "web-modules/restx/src/main/webapp"; public static void main(String[] args) throws Exception { int port = Integer.valueOf(Optional.fromNullable(System.getenv("PORT")).or("8080")); - WebServer server = new Jetty8WebServer(WEB_INF_LOCATION, WEB_APP_LOCATION, port, "0.0.0.0"); + WebServer server = new Jetty11WebServer(WEB_INF_LOCATION, WEB_APP_LOCATION, port, "0.0.0.0"); /* * load mode from system property if defined, or default to dev From 78d8f62ef7f5453f02522eba2999b124338bc126 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 26 Sep 2023 10:05:04 +0700 Subject: [PATCH 016/831] [Add] completablefuture timeout test --- .../core-java-concurrency-simple/pom.xml | 9 ++ .../CompletableFutureTimeoutUnitTest.java | 83 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java diff --git a/core-java-modules/core-java-concurrency-simple/pom.xml b/core-java-modules/core-java-concurrency-simple/pom.xml index a16df4fc97..720ab5a0ed 100644 --- a/core-java-modules/core-java-concurrency-simple/pom.xml +++ b/core-java-modules/core-java-concurrency-simple/pom.xml @@ -12,6 +12,15 @@ 0.0.1-SNAPSHOT + + + org.wiremock + wiremock + 3.1.0 + test + + + core-java-concurrency-simple diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java new file mode 100644 index 0000000000..f54e5f4af5 --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.concurrent.completablefuture; + +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.*; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +public class CompletableFutureTimeoutUnitTest { + private static WireMockServer wireMockServer; + private static ScheduledExecutorService executorService; + private static final int DEFAULT_TIMEOUT = 500; //0.5 seconds + private static final int TIMEOUT_STATUS_CODE = 408; //0.5 seconds + + @BeforeAll + public static void setUp() { + wireMockServer = new WireMockServer(8080); + wireMockServer.start(); + WireMock.configureFor("localhost", 8080); + + stubFor(get(urlEqualTo("/api/dummy")) + .willReturn(aResponse() + .withFixedDelay(5000) // must be > DEFAULT_TIMEOUT for a timeout to occur. + .withStatus(408))); + + executorService = Executors.newScheduledThreadPool(1); + } + + + @AfterAll + public static void tearDown() { + executorService.shutdown(); + wireMockServer.stop(); + } + + private CompletableFuture createDummyRequest() { + return CompletableFuture.supplyAsync(() -> { + try { + URL url = new URL("http://localhost:8080/api/dummy"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + try { + return connection.getResponseCode(); + } finally { + connection.disconnect(); + } + } catch (IOException e) { + return TIMEOUT_STATUS_CODE; + } + }); + } + + @Test + public void whenorTimeout_thenGetThrow() { + CompletableFuture completableFuture = createDummyRequest() + .orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + assertThrows(ExecutionException.class, completableFuture::get); + } + + @Test + public void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { + CompletableFuture completableFuture = createDummyRequest() + .completeOnTimeout(TIMEOUT_STATUS_CODE, DEFAULT_TIMEOUT, + TimeUnit.MILLISECONDS); + assertEquals(TIMEOUT_STATUS_CODE, completableFuture.get()); + } + + @Test + public void whencompleteExceptionally_thenGetThrow() { + CompletableFuture completableFuture = createDummyRequest(); + executorService.schedule(() -> completableFuture + .completeExceptionally(new TimeoutException("Timeout occurred")), DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + assertThrows(ExecutionException.class, completableFuture::get); + } + +} From 02b511075105e2ee902c726018f3401008927979 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 26 Sep 2023 08:20:55 +0300 Subject: [PATCH 017/831] [JAVA-12183] Moved restx module to jdk9-and-above profile --- pom.xml | 2 -- web-modules/pom.xml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 060f158888..00b5b88d47 100644 --- a/pom.xml +++ b/pom.xml @@ -361,7 +361,6 @@ muleesb web-modules/java-lite - web-modules/restx persistence-modules/deltaspike persistence-modules/hibernate-ogm persistence-modules/spring-data-cassandra-reactive @@ -534,7 +533,6 @@ lombok-modules/lombok-custom muleesb web-modules/java-lite - web-modules/restx persistence-modules/deltaspike persistence-modules/hibernate-ogm persistence-modules/spring-data-cassandra-reactive diff --git a/web-modules/pom.xml b/web-modules/pom.xml index 2dcec681ad..684283b546 100644 --- a/web-modules/pom.xml +++ b/web-modules/pom.xml @@ -31,7 +31,7 @@ ratpack resteasy - + restx spark-java struts-2 vraptor From 00671fd084febdf9afb23cf9a56f099d1cbc9a86 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 26 Sep 2023 18:53:59 +0530 Subject: [PATCH 018/831] Review Comments --- .../java/com/baeldung/deserializer/BooleanDeserializer.java | 6 +++--- .../baeldung/controller/ValidationControllerUnitTest.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java index 5b50b75675..01a8e0eba0 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/deserializer/BooleanDeserializer.java @@ -10,12 +10,12 @@ public class BooleanDeserializer extends JsonDeserializer { @Override public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException { String value = parser.getText(); - if (value != null && (value.equals("TRUE") || value.equals("1") || value.equals("+"))) { + if (value != null && value.equals("+")) { return Boolean.TRUE; - } else if (value != null && (value.equals("FALSE") || value.equals("0") || value.equals("-"))) { + } else if (value != null && value.equals("-")) { return Boolean.FALSE; } else { - throw new IllegalArgumentException("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0"); + throw new IllegalArgumentException("Only values accepted as Boolean are + and -"); } } } \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index f312e1259c..73db4eb4eb 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -84,13 +84,13 @@ class ValidationControllerUnitTest { .getResponse() .getContentAsString(); - assertEquals("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0", output); + assertEquals("Only values accepted as Boolean are + and -", output); } @Test void testInvalidBooleanFromJson() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"6\"}"; + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"plus\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) @@ -98,7 +98,7 @@ class ValidationControllerUnitTest { .getResponse() .getContentAsString(); - assertEquals("Only values accepted as Boolean are TRUE, FALSE, +, -, 1 , 0", output); + assertEquals("Only values accepted as Boolean are + and -", output); } From e9536ff0c4709a54c89d5b3f08e58c29bb7dd62b Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 27 Sep 2023 09:20:07 +0700 Subject: [PATCH 019/831] [Update] set DEFAULT_TIMEOUT to 1000 --- .../completablefuture/CompletableFutureTimeoutUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index f54e5f4af5..43b8075ebd 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; public class CompletableFutureTimeoutUnitTest { private static WireMockServer wireMockServer; private static ScheduledExecutorService executorService; - private static final int DEFAULT_TIMEOUT = 500; //0.5 seconds + private static final int DEFAULT_TIMEOUT = 1000; //1 seconds private static final int TIMEOUT_STATUS_CODE = 408; //0.5 seconds @BeforeAll From fe9c78ceb8999b37477da54bf58566e5d4fe328c Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Thu, 28 Sep 2023 16:29:51 +0100 Subject: [PATCH 020/831] BAEL-6895 Add code for truncating a double to two decimal places --- .../TruncateDoubleUnitTest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java new file mode 100644 index 0000000000..d5881c5d66 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.truncatedouble; + +import static org.junit.Assert.assertEquals; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.NumberFormat; + +import org.junit.Test; + +public class TruncateDoubleUnitTest { + + @Test + public void givenADouble_whenUsingDecimalFormat_truncateToTwoDecimalPlaces() { + DecimalFormat df = new DecimalFormat("#.##"); + df.setRoundingMode(RoundingMode.DOWN); + + double value = 1.55555555; + String truncated = df.format(value); + assertEquals("1.55", truncated); + + double negativeValue = -1.55555555; + String negativeTruncated = df.format(negativeValue); + assertEquals("-1.55", negativeTruncated); + } + + @Test + public void givenADouble_whenUsingNumberFormat_truncateToTwoDecimalPlaces() { + NumberFormat nf = NumberFormat.getNumberInstance(); + nf.setMaximumFractionDigits(2); + nf.setRoundingMode(RoundingMode.DOWN); + + double value = 1.55555555; + String truncated = nf.format(value); + assertEquals("1.55", truncated); + + double negativeValue = -1.55555555; + String negativeTruncated = nf.format(negativeValue); + assertEquals("-1.55", negativeTruncated); + } + + @Test + public void givenADouble_whenUsingBigDecimal_truncateToTwoDecimalPlaces() { + BigDecimal positive = new BigDecimal(2.555555).setScale(2, RoundingMode.DOWN); + BigDecimal negative = new BigDecimal(-2.555555).setScale(2, RoundingMode.DOWN); + assertEquals("2.55", positive.toString()); + assertEquals("-2.55", negative.toString()); + } + + @Test + public void givenADouble_whenUsingMath_truncateToTwoDecimalPlaces() { + double positive = 1.55555555; + double truncated = Math.floor(positive * 100) / 100; + assertEquals("1.55", String.valueOf(truncated)); + + double negative = -1.55555555; + double negativeTruncated = Math.ceil(negative * 100) / 100; + assertEquals("-1.55", String.valueOf(negativeTruncated)); + } + + @Test + public void givenADouble_whenUsingStringFormat_truncateToTwoDecimalPlaces() { + double value = 1.55555555; + String truncated = String.format("%.2f", value); + assertEquals("1.56", truncated); + } + +} From 5f016b6220a57fb1c777c0aaf5fe0e4263ff9656 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 30 Sep 2023 13:11:57 +0100 Subject: [PATCH 021/831] Create HttpSecurityConfig.java --- .../HttpSecurityConfig.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java new file mode 100644 index 0000000000..19ffa2fdb3 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java @@ -0,0 +1,32 @@ +package com.baeldung.httpsecurityvswebsecurity; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + // Given: HttpSecurity configured + + http + .authorizeRequests() + .antMatchers("/public/**").permitAll() + .antMatchers("/admin/**").hasRole("ADMIN") + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .permitAll(); + + // When: Accessing specific URLs + // Then: Access is granted based on defined rules + } +} From 9058fad8226ae8645b5a35fe950a42773623e8f7 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 30 Sep 2023 13:14:08 +0100 Subject: [PATCH 022/831] Create WebSecurityConfig.java --- .../WebSecurityConfig.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java new file mode 100644 index 0000000000..11b740c744 --- /dev/null +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -0,0 +1,31 @@ +package com.baeldung.httpsecurityvswebsecurity; + +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private UserDetailsService userDetailsService; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/").permitAll() + .anyRequest().authenticated() + .and() + .formLogin(); + } +} From 54469285479cc1cd2da23f345b47a33f415f032d Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 30 Sep 2023 13:15:37 +0100 Subject: [PATCH 023/831] Update pom.xml add necessary dependencies --- spring-security-modules/spring-security-core/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-core/pom.xml b/spring-security-modules/spring-security-core/pom.xml index 0eb70c0853..d8f2ce7dc9 100644 --- a/spring-security-modules/spring-security-core/pom.xml +++ b/spring-security-modules/spring-security-core/pom.xml @@ -49,6 +49,16 @@ org.springframework.security spring-security-test + + org.springframework.security + spring-security-web + 5.8.4 + + + org.springframework.security + spring-security-core + 5.8.4 + @@ -100,4 +110,4 @@ - \ No newline at end of file + From db9dc5f286bae244ca4467f6443fee09df286c8c Mon Sep 17 00:00:00 2001 From: ovidiu-mihai98 <138307181+ovidiumihaitacu@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:21:21 +0300 Subject: [PATCH 024/831] [BAEL-6794] Is Java Reflection Bad Practice? --- .../disadvantages/encapsulation/MyClass.java | 11 +++++ .../performance/BenchmarkRunner.java | 7 +++ .../performance/InitializationBenchmark.java | 29 +++++++++++ .../MethodInvocationBenchmark.java | 48 +++++++++++++++++++ .../disadvantages/performance/Person.java | 38 +++++++++++++++ .../ReflectionEncapsulationUnitTest.java | 21 ++++++++ 6 files changed, 154 insertions(+) create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java create mode 100644 core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java create mode 100644 core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java new file mode 100644 index 0000000000..680079adea --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java @@ -0,0 +1,11 @@ +package com.baeldung.reflection.disadvantages.encapsulation; + +public class MyClass { + + private String veryPrivateField; + + public MyClass() { + + this.veryPrivateField = "Secret Information"; + } +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java new file mode 100644 index 0000000000..1de026f796 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java @@ -0,0 +1,7 @@ +package com.baeldung.reflection.disadvantages.performance; + +public class BenchmarkRunner { + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java new file mode 100644 index 0000000000..e6c0c3daea --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java @@ -0,0 +1,29 @@ +package com.baeldung.reflection.disadvantages.performance; + +import org.openjdk.jmh.annotations.*; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.TimeUnit; + +public class InitializationBenchmark { + + @Benchmark + @Fork(value = 1, warmups = 1) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @BenchmarkMode(Mode.AverageTime) + public void directInit() { + + Person person = new Person("John", "Doe", 50); + } + + @Benchmark + @Fork(value = 1, warmups = 1) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @BenchmarkMode(Mode.AverageTime) + public void reflectiveInit() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + + Constructor constructor = Person.class.getDeclaredConstructor(String.class, String.class, Integer.class); + Person person = constructor.newInstance("John", "Doe", 50); + } +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java new file mode 100644 index 0000000000..1128cf8f33 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java @@ -0,0 +1,48 @@ +package com.baeldung.reflection.disadvantages.performance; + +import org.openjdk.jmh.annotations.*; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +public class MethodInvocationBenchmark { + + @Benchmark + @Fork(value = 1, warmups = 1) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @BenchmarkMode(Mode.AverageTime) + public void directCall() { + + directCall(new Person("John", "Doe", 50)); + } + + @Benchmark + @Fork(value = 1, warmups = 1) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @BenchmarkMode(Mode.AverageTime) + public void reflectiveCall() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException { + + reflectiveCall(new Person("John", "Doe", 50)); + } + + + private void directCall(Person person) { + + person.getFirstName(); + person.getLastName(); + person.getAge(); + } + + private void reflectiveCall(Person person) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + + Method getFirstNameMethod = Person.class.getMethod("getFirstName"); + getFirstNameMethod.invoke(person); + + Method getLastNameMethod = Person.class.getMethod("getLastName"); + getLastNameMethod.invoke(person); + + Method getAgeMethod = Person.class.getMethod("getAge"); + getAgeMethod.invoke(person); + } +} diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java new file mode 100644 index 0000000000..014c82ba45 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java @@ -0,0 +1,38 @@ +package com.baeldung.reflection.disadvantages.performance; + +public class Person { + + private String firstName; + private String lastName; + private Integer age; + + public Person(String firstName, String lastName, Integer age) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java new file mode 100644 index 0000000000..efb0a7da31 --- /dev/null +++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.reflection.disadvantages.encapsulation; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ReflectionEncapsulationUnitTest { + + @Test + public void givenPrivateField_whenUsingReflection_thenIsAccessible() throws IllegalAccessException, NoSuchFieldException { + MyClass myClassInstance = new MyClass(); + + Field privateField = MyClass.class.getDeclaredField("veryPrivateField"); + privateField.setAccessible(true); + + String accessedField = privateField.get(myClassInstance).toString(); + assertEquals(accessedField, "Secret Information"); + } +} From 2934a2c1b07b159596dac778c353debd7ecf5ebb Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 2 Oct 2023 23:42:50 +0530 Subject: [PATCH 025/831] BAEL-6910, Spring Boot 3.1's ConnectionDetails abstraction --- spring-boot-modules/spring-boot-3/pom.xml | 70 ++++++++++++ .../ConnectionDetailsApplication.java | 16 +++ .../adapter/VaultAdapter.java | 107 ++++++++++++++++++ .../CustomCassandraConnectionDetails.java | 32 ++++++ ...ssandraConnectionDetailsConfiguration.java | 17 +++ .../CustomElasticsearchConnectionDetails.java | 29 +++++ ...csearchConnectionDetailsConfiguration.java | 17 +++ .../CustomNeo4jConnectionDetails.java | 24 ++++ ...omNeo4jConnectionDetailsConfiguration.java | 17 +++ .../JdbcConnectionDetailsConfiguration.java | 17 +++ .../MongoDBConnectionDetails.java | 14 +++ ...MongoDBConnectionDetailsConfiguration.java | 17 +++ .../PostgresConnectionDetails.java | 21 ++++ .../R2dbcPostgresConnectionDetails.java | 22 ++++ ...ostgresConnectionDetailsConfiguration.java | 17 +++ .../RabbitMQConnectionDetails.java | 34 ++++++ ...abbitMQConnectionDetailsConfiguration.java | 17 +++ .../RedisCacheConnectionDetails.java | 26 +++++ .../RedisConnectionDetailsConfiguration.java | 17 +++ .../entity/elastic/Person.java | 27 +++++ .../entity/neo4j/Person.java | 27 +++++ .../resources/application-docker-compose.yml | 7 -- .../src/main/resources/application.yml | 2 +- .../application-cassandra.properties | 11 ++ .../application-elastic.properties | 7 ++ .../application-jdbc.properties | 7 ++ .../application-mongo.properties | 8 ++ .../application-neo4j.properties | 7 ++ .../application-r2dbc.properties | 7 ++ .../application-rabbitmq.properties | 7 ++ .../application-redis.properties | 7 ++ ...ssandra-connection-details-class-diag.puml | 27 +++++ .../connection-details-sequence-design.puml | 16 +++ .../docker-compose-cassandra.yml | 9 ++ .../docker-compose-elastic.yml | 12 ++ .../connectiondetails/docker-compose-jdbc.yml | 10 ++ .../docker-compose-mongo.yml | 10 ++ .../docker-compose-neo4j.yml | 8 ++ .../docker-compose-rabbitmq.yml | 9 ++ .../docker-compose-redis.yml | 8 ++ .../docker-connectiondetails-compose.yml | 39 +++++++ ...csearch-connection-details-class-diag.puml | 25 ++++ .../jdbcconnection-details-class-diag.puml | 25 ++++ ...mongodb-connection-details-class-diag.puml | 19 ++++ .../r2dbcconnection-details-class-diag.puml | 21 ++++ ...abbitmq-connection-details-class-diag.puml | 27 +++++ ...edis-connection-details-class-diagram.puml | 23 ++++ ...andraConnectionDetailsIntegrationTest.java | 37 ++++++ ...earchConnectionDetailsIntegrationTest.java | 45 ++++++++ .../JdbcConnectionDetailsIntegrationTest.java | 38 +++++++ ...ngoDBConnectionDetailsIntegrationTest.java | 47 ++++++++ ...Neo4jConnectionDetailsIntegrationTest.java | 43 +++++++ ...R2dbcConnectionDetailsIntegrationTest.java | 40 +++++++ ...bitmqConnectionDetailsIntegrationTest.java | 62 ++++++++++ ...acheConnnectionDetailsIntegrationTest.java | 34 ++++++ 55 files changed, 1281 insertions(+), 8 deletions(-) create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index 7e61ca18af..a1f3ee6203 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -94,6 +94,75 @@ org.springframework.boot spring-boot-starter-test + + org.springframework.boot + spring-boot-testcontainers + test + + + org.testcontainers + postgresql + test + + + org.testcontainers + junit-jupiter + ${testcontainers.version} + test + + + org.postgresql + postgresql + runtime + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.amqp + spring-rabbit-test + test + + + org.springframework.data + spring-data-redis + + + redis.clients + jedis + jar + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.postgresql + r2dbc-postgresql + runtime + + + org.springframework.boot + spring-boot-starter-data-r2dbc + + + io.projectreactor + reactor-test + test + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + org.springframework.boot + spring-boot-starter-data-cassandra + + + org.springframework.boot + spring-boot-starter-data-neo4j + @@ -189,6 +258,7 @@ 5.14.0 3.1.0 0.2.0 + 1.18.3 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java new file mode 100644 index 0000000000..a9b49e24e3 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.connectiondetails; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +public class ConnectionDetailsApplication { + + public static void main(String[] args) { + SpringApplication.run(ConnectionDetailsApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java new file mode 100644 index 0000000000..1c9449ad00 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java @@ -0,0 +1,107 @@ +package com.baeldung.connectiondetails.adapter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VaultAdapter { + private static final Logger logger = LoggerFactory.getLogger(VaultAdapter.class); + public static String getSecret(String secretKey) { + logger.info("call vault to get the secret of key: " + secretKey); + + //Postgres keys + if (secretKey.equalsIgnoreCase("postgres_secret_key")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("postgres_user_key")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("postgres_jdbc_url")) { + return "jdbc:postgresql://localhost:15432/postgresdb"; + } + //RabbitMQ Server Keys + if (secretKey.equalsIgnoreCase("rabbitmq_username")) { + return "rabbitmquser"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_password")) { + return "rabbitmq"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_port")) { + return "5672"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_host")) { + return "localhost"; + } + //Redis Server Keys + if (secretKey.equalsIgnoreCase("redis_username")) { + return null; + } + if (secretKey.equalsIgnoreCase("redis_password")) { + return "redis"; + } + if (secretKey.equalsIgnoreCase("redis_port")) { + return "6379"; + } + if (secretKey.equalsIgnoreCase("redis_host")) { + return "localhost"; + } + //Mongo DB Keys + if (secretKey.equalsIgnoreCase("mongo_connection_string")) { + return "mongodb://localhost:27017/demodb"; + } + + //r2dbc Keys + if (secretKey.equalsIgnoreCase("r2dbc_postgres_user")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_secret")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_port")) { + return "15432"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_database")) { + return "postgresdb"; + } + //Elastic Search Keys + if (secretKey.equalsIgnoreCase("elastic_user")) { + return "elastic"; + } + if (secretKey.equalsIgnoreCase("elastic_secret")) { + return "secret"; + } + if (secretKey.equalsIgnoreCase("elastic_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("elastic_port1")) { + return "19200"; + } + if (secretKey.equalsIgnoreCase("elastic_port2")) { + return "19300"; + } + //Cassandra keys + if (secretKey.equalsIgnoreCase("cassandra_user")) { + return "cassandra"; + } + if (secretKey.equalsIgnoreCase("cassandra_secret")) { + return "secret"; + } + if (secretKey.equalsIgnoreCase("cassandra_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("cassandra_port")) { + return "19042"; + } + //Neo4j Keys + if (secretKey.equalsIgnoreCase("neo4j_secret")) { + return "neo4j123"; + } + if (secretKey.equalsIgnoreCase("neo4j_uri")) { + return "bolt://localhost:17687"; + } + + return "secretVal"; + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java new file mode 100644 index 0000000000..6a246cd9fc --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java @@ -0,0 +1,32 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; + +import java.util.List; + +public class CustomCassandraConnectionDetails implements CassandraConnectionDetails { + @Override + public List getContactPoints() { + Node node = new Node( + VaultAdapter.getSecret("cassandra_host"), + Integer.parseInt(VaultAdapter.getSecret("cassandra_port")) + ); + return List.of(node); + } + + @Override + public String getUsername() { + return VaultAdapter.getSecret("cassandra_user"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("cassandra_secret"); + } + + @Override + public String getLocalDatacenter() { + return "datacenter-1"; + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..02ed8c0051 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("cassandra") +public class CustomCassandraConnectionDetailsConfiguration { + @Bean + @Primary + public CassandraConnectionDetails getCustomCassandraConnectionDetails() { + return new CustomCassandraConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java new file mode 100644 index 0000000000..0b45878bc9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java @@ -0,0 +1,29 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; + +import java.util.List; + +public class CustomElasticsearchConnectionDetails implements ElasticsearchConnectionDetails { + @Override + public List getNodes() { + Node node1 = new Node( + VaultAdapter.getSecret("elastic_host"), + Integer.parseInt(VaultAdapter.getSecret("elastic_port1")), + Node.Protocol.HTTP + ); + return List.of(node1); + } + + @Override + public String getUsername() { + return VaultAdapter.getSecret("elastic_user"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("elastic_secret"); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..a9b3da44fa --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("elastic") +public class CustomElasticsearchConnectionDetailsConfiguration { + @Bean + @Primary + public ElasticsearchConnectionDetails getCustomElasticConnectionDetails() { + return new CustomElasticsearchConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java new file mode 100644 index 0000000000..c0412fbb21 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java @@ -0,0 +1,24 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.neo4j.driver.AuthToken; +import org.neo4j.driver.AuthTokens; +import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; + +import java.net.URI; +import java.net.URISyntaxException; + +public class CustomNeo4jConnectionDetails implements Neo4jConnectionDetails { + @Override + public URI getUri() { + try { + return new URI(VaultAdapter.getSecret("neo4j_uri")); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + @Override + public AuthToken getAuthToken() { + return AuthTokens.basic("neo4j", VaultAdapter.getSecret("neo4j_secret")); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..aec8908c7d --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("neo4j") +public class CustomNeo4jConnectionDetailsConfiguration { + @Bean + @Primary + public Neo4jConnectionDetails getNeo4jConnectionDetails() { + return new CustomNeo4jConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..3387356366 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("jdbc") +public class JdbcConnectionDetailsConfiguration { + @Bean + @Primary + public JdbcConnectionDetails getPostgresConnection() { + return new PostgresConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java new file mode 100644 index 0000000000..df689d81b6 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java @@ -0,0 +1,14 @@ +package com.baeldung.connectiondetails.configuration; + + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import com.mongodb.ConnectionString; +import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; + +public class MongoDBConnectionDetails implements MongoConnectionDetails { + @Override + public ConnectionString getConnectionString() { + return new ConnectionString(VaultAdapter.getSecret("mongo_connection_string")); + } +} + diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..d455991d08 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("mongo") +public class MongoDBConnectionDetailsConfiguration { + @Bean + @Primary + public MongoConnectionDetails getMongoConnectionDetails() { + return new MongoDBConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java new file mode 100644 index 0000000000..c9b213a8d3 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java @@ -0,0 +1,21 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; + +public class PostgresConnectionDetails implements JdbcConnectionDetails { + @Override + public String getUsername() { + return VaultAdapter.getSecret("postgres_user_key"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("postgres_secret_key"); + } + + @Override + public String getJdbcUrl() { + return VaultAdapter.getSecret("postgres_jdbc_url"); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java new file mode 100644 index 0000000000..4ce6abc9d5 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java @@ -0,0 +1,22 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; + +public class R2dbcPostgresConnectionDetails implements R2dbcConnectionDetails { + @Override + public ConnectionFactoryOptions getConnectionFactoryOptions() { + + ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() + .option(ConnectionFactoryOptions.DRIVER, "postgresql") + .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host")) + .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port"))) + .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user")) + .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret")) + .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database")) + .build(); + + return options; + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..144355dce4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("r2dbc") +public class R2dbcPostgresConnectionDetailsConfiguration { + @Bean + @Primary + public R2dbcConnectionDetails getR2dbcPostgresConnectionDetails() { + return new R2dbcPostgresConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java new file mode 100644 index 0000000000..9dc4bdf33b --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java @@ -0,0 +1,34 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; + +import java.util.List; + +public class RabbitMQConnectionDetails implements RabbitConnectionDetails { + @Override + public String getUsername() { + return VaultAdapter.getSecret("rabbitmq_username"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("rabbitmq_password"); + } + + @Override + public String getVirtualHost() { + return "/"; + } + + @Override + public List
getAddresses() { + return List.of(this.getFirstAddress()); + } + + @Override + public Address getFirstAddress() { + return new Address(VaultAdapter.getSecret("rabbitmq_host"), + Integer.parseInt(VaultAdapter.getSecret("rabbitmq_port"))); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..237bec3fc4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("rabbitmq") +public class RabbitMQConnectionDetailsConfiguration { + @Primary + @Bean + public RabbitConnectionDetails getRabbitmqConnection() { + return new RabbitMQConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java new file mode 100644 index 0000000000..9485f22240 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java @@ -0,0 +1,26 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; + +public class RedisCacheConnectionDetails implements RedisConnectionDetails { + @Override + public String getPassword() { + return VaultAdapter.getSecret("redis_password"); + } + + @Override + public Standalone getStandalone() { + return new Standalone() { + @Override + public String getHost() { + return VaultAdapter.getSecret("redis_host"); + } + + @Override + public int getPort() { + return Integer.parseInt(VaultAdapter.getSecret("redis_port")); + } + }; + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..31816ff0b4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("redis") +public class RedisConnectionDetailsConfiguration { + @Bean + @Primary + public RedisConnectionDetails getRedisCacheConnection() { + return new RedisCacheConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java new file mode 100644 index 0000000000..851dbb7c90 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.connectiondetails.entity.elastic; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +@Document(indexName = "person") +public class Person { + String name; + @Id + String ssn; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSsn() { + return ssn; + } + + public void setSsn(String ssn) { + this.ssn = ssn; + } +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java new file mode 100644 index 0000000000..63e88d0a41 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.connectiondetails.entity.neo4j; + +import org.springframework.data.neo4j.core.schema.Id; +import org.springframework.data.neo4j.core.schema.Node; + +@Node +public class Person { + @Id + String name; + String zipcode; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getZipcode() { + return zipcode; + } + + public void setZipcode(String zipcode) { + this.zipcode = zipcode; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml deleted file mode 100644 index bce67fa400..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/application-docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - docker: - compose: - enabled: true - file: docker-compose.yml - autoconfigure: - exclude: org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml index 3885e59a61..b1e79ca17e 100644 --- a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml @@ -19,7 +19,7 @@ spring: compose: enabled: false autoconfigure: - exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration + exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration cors: allow: diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties new file mode 100644 index 0000000000..ea2619bada --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties @@ -0,0 +1,11 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-cassandra.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=cassandra +spring.cassandra.local-datacenter=dc1 +#spring.cassandra.keyspace-name=spring_cassandra +#spring.cassandra.schema-action=CREATE_IF_NOT_EXISTS +spring.data.cassandra.request.timeout=20000 # Set your desired timeout in milliseconds +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties new file mode 100644 index 0000000000..e9f32c252b --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-elastic.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=elastic +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties new file mode 100644 index 0000000000..40f9d1fd68 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=jdbc +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties new file mode 100644 index 0000000000..4dd355bbed --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties @@ -0,0 +1,8 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-mongo.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=mongo +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration +spring.data.mongodb.database=demodb \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties new file mode 100644 index 0000000000..9e6c9c0f11 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-neo4j.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=neo4j +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties new file mode 100644 index 0000000000..91d2fba818 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=r2dbc +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties new file mode 100644 index 0000000000..fe9bfa3ecb --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-rabbitmq.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=rabbitmq +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties new file mode 100644 index 0000000000..9e4973164e --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker-compose-redis.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=redis +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml new file mode 100644 index 0000000000..339f658e1a --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml @@ -0,0 +1,27 @@ +@startuml +'https://plantuml.com/class-diagram + +interface CassandraConnectionDetails { + +getUsername():String + +getPassword():String + +getContactPoints():List + +getLocalDatacenter():String +} +class CustomCassandraConnectionDetails { + +getUsername():String + +getPassword():String + +getContactPoints():List + +getLocalDatacenter():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomCassandraConnectionDetailsConfiguration { + +getCustomCassandraConnectionDetails():CassandraConnectionDetails +} +CustomCassandraConnectionDetails -left-> VaultAdapter:uses +CustomCassandraConnectionDetails -right-|> CassandraConnectionDetails : implements +CustomCassandraConnectionDetailsConfiguration -up-> CustomCassandraConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml new file mode 100644 index 0000000000..a2a917eea0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml @@ -0,0 +1,16 @@ +@startuml +'https://plantuml.com/sequence-diagram +skinparam sequenceMessageAlign direction +skinparam handwritten true +skinparam sequence { +ParticipantBackgroundColor beige +ParticipantPadding 50 +} +autonumber + +"Spring Boot" -[#63b175]> "Hashicorp Vault": Secret Request +"Hashicorp Vault" -[#63b175]-> "Spring Boot": Secret Response +"Spring Boot" -[#63b175]> "Remote Service": Connection Request + +"Remote Service" -[#63b175]-> "Spring Boot": Connection Response +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml new file mode 100644 index 0000000000..c593cbc73b --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml @@ -0,0 +1,9 @@ +version: '3.8' +services: + cassandra: + image: 'cassandra:latest' + environment: + - 'CASSANDRA_DC=datacenter-1' + - 'CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch' + ports: + - '19042:9042' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml new file mode 100644 index 0000000000..a6e51ee1a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml @@ -0,0 +1,12 @@ +version: '3.8' +services: + elasticsearch: + image: 'docker.elastic.co/elasticsearch/elasticsearch:7.17.10' + environment: + - 'ELASTIC_USERNAME=elastic' + - 'ELASTIC_PASSWORD=secret' + - 'discovery.type=single-node' + - 'xpack.security.enabled=false' + ports: + - '19200:9200' +# - '19300:9300' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml new file mode 100644 index 0000000000..65a8f135e8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml @@ -0,0 +1,10 @@ +version: '3.8' +services: + database: + image: 'postgres:13.1-alpine' + ports: + - '15432:5432' + environment: + - 'POSTGRES_USER=postgres' + - 'POSTGRES_DB=postgresdb' + - 'POSTGRES_PASSWORD=postgres' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml new file mode 100644 index 0000000000..f12f5c3aa7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml @@ -0,0 +1,10 @@ +version: '3.8' +services: + mongodb: + image: 'mongo:latest' + environment: + - 'MONGO_INITDB_DATABASE=demodb' +# - 'MONGO_INITDB_ROOT_PASSWORD=Mongo123' +# - 'MONGO_INITDB_ROOT_USERNAME=mongouser' + ports: + - '27017:27017' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml new file mode 100644 index 0000000000..611951e755 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml @@ -0,0 +1,8 @@ +version: '3.8' +services: + neo4j: + image: 'neo4j:latest' + ports: + - '17687:7687' + environment: + NEO4J_AUTH: neo4j/neo4j123 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml new file mode 100644 index 0000000000..8abf19bd19 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml @@ -0,0 +1,9 @@ +version: '3.8' +services: + rabbitmq: + image: 'rabbitmq:latest' + environment: + - 'RABBITMQ_DEFAULT_PASS=rabbitmq' + - 'RABBITMQ_DEFAULT_USER=rabbitmquser' + ports: + - '5672:5672' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml new file mode 100644 index 0000000000..c218cef998 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml @@ -0,0 +1,8 @@ +version: '3.8' +services: + redis: + image: 'redis:latest' + ports: + - '6379:6379' + environment: + - 'REDIS_REQUIREPASS=redis' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml new file mode 100644 index 0000000000..4d2bded9eb --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml @@ -0,0 +1,39 @@ +version: '3.8' +services: + database: + profiles: + - 'jdbc' + image: 'postgres:13.1-alpine' + ports: + - '15432:5432' + environment: + - 'POSTGRES_USER=postgres' + - 'POSTGRES_DB=postgresdb' + - 'POSTGRES_PASSWORD=postgres' + rabbitmq: + profiles: + - 'rabbitmq' + image: 'rabbitmq:latest' + environment: + - 'RABBITMQ_DEFAULT_PASS=rabbitmq' + - 'RABBITMQ_DEFAULT_USER=rabbitmquser' + ports: + - '5672:5672' + redis: + profiles: + - 'redis' + image: 'redis:latest' + ports: + - '6379:6379' + environment: + - 'REDIS_REQUIREPASS=redis' +# mongodb: +# profiles: +# - 'mongo-test' +# image: 'mongo:latest' +# environment: +# - 'MONGO_INITDB_DATABASE=demodb' +# - 'MONGO_INITDB_ROOT_PASSWORD=mongo' +# - 'MONGO_INITDB_ROOT_USERNAME=mongouser' +# ports: +# - '27017:27017' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml new file mode 100644 index 0000000000..48db0bcc4f --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +interface ElasticsearchConnectionDetails { + +getUsername():String + +getPassword():String + +getNodes():List +} +class CustomElasticsearchConnectionDetails { + +getUsername():String + +getPassword():String + +getNodes():List +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomElasticsearchConnectionDetailsConfiguration { + +getCustomElasticConnectionDetails():ElasticsearchConnectionDetails +} +CustomElasticsearchConnectionDetails -left-> VaultAdapter:uses +CustomElasticsearchConnectionDetails -right-|> ElasticsearchConnectionDetails : implements +CustomElasticsearchConnectionDetailsConfiguration -up-> CustomElasticsearchConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml new file mode 100644 index 0000000000..88de5d607f --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +interface JdbcConnectionDetails { + +getUsername():String + +getPassword():String + +getJdbcUrl():String +} +class PostgresConnectionDetails { + +getUsername():String + +getPassword():String + +getJdbcUrl():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class JdbcConnectonDetailsConfiguration { + +getPostgresConnection():JdbcConnectionDetails +} +PostgresConnectionDetails -left-> VaultAdapter:uses +PostgresConnectionDetails -right-|> JdbcConnectionDetails : implements +JdbcConnectonDetailsConfiguration -up-> PostgresConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml new file mode 100644 index 0000000000..974c6de601 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml @@ -0,0 +1,19 @@ +@startuml +'https://plantuml.com/class-diagram + +interface MongoConnectionDetails { + getConnectionString():ConnectionString +} +class MongoDBConnectionDetails { + getConnectionString():ConnectionString +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class MongoDBConnectionDetailsConfiguration { + +getMongoConnectionDetails() : MongoConnectionDetails +} +MongoDBConnectionDetails -left-> VaultAdapter:uses +MongoDBConnectionDetails -right-|> MongoConnectionDetails : implements +MongoDBConnectionDetailsConfiguration -up-> MongoDBConnectionDetails:uses +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml new file mode 100644 index 0000000000..ec69587ab9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/class-diagram + +interface R2dbcConnectionDetails { + +getConnectionFactoryOptions():ConnectionFactoryOptions +} +class R2dbcPostgresConnectionDetails { + +getConnectionFactoryOptions():ConnectionFactoryOptions +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class R2dbcPostgresConnectionDetailsConfiguration { + +getR2dbcPostgresConnectionDetails():R2dbcConnectionDetails +} +R2dbcPostgresConnectionDetails -right-> VaultAdapter:uses +R2dbcPostgresConnectionDetails -up-|> R2dbcConnectionDetails:implements +R2dbcPostgresConnectionDetailsConfiguration -up-> R2dbcPostgresConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml new file mode 100644 index 0000000000..0541e12915 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml @@ -0,0 +1,27 @@ +@startuml +'https://plantuml.com/class-diagram + +interface RabbitConnectionDetails { + +getUsername():String + +getPassword():String + +getFirstAddress():Address + +getAddresses():List
+} +class RabbitMQConnectionDetails { + +getUsername():String + +getPassword():String + +getFirstAddress():Address + +getAddresses():List
+} +class VaultAdapter { + +getSecret(String secretKey):String +} +class RabbitMQConnectionDetailsConfiguration { + +getRabbitmqConnection() : RabbitConnectionDetails +} +RabbitMQConnectionDetails -left-> VaultAdapter:uses +RabbitMQConnectionDetails -right-|> RabbitConnectionDetails : implements +RabbitMQConnectionDetailsConfiguration -up-> RabbitMQConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml new file mode 100644 index 0000000000..a18c83a8be --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml @@ -0,0 +1,23 @@ +@startuml +'https://plantuml.com/class-diagram + +interface RedisConnectionDetails { + +getPassword():String + +getStandalone():Standalone +} +class RedisCacheConnectionDetails { + +getPassword():String + +getStandalone():Standalone +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class RedisConnectonDetailsConfiguration { + +getRedisCacheConnection():RedisConnectionDetails +} +RedisCacheConnectionDetails -left-> VaultAdapter:uses +RedisCacheConnectionDetails -right-|> RedisConnectionDetails : implements +RedisConnectonDetailsConfiguration -up-> RedisCacheConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..6380f6375f --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.cassandra.core.CassandraTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomCassandraConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"}) +@ActiveProfiles("cassandra") +public class CassandraConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class); + @Autowired + private CassandraTemplate cassandraTemplate; + @Test + public void givenHashicorpVault_whenRunQuery_thenSuccess() { + Boolean result = cassandraTemplate.getCqlOperations() + .execute("CREATE KEYSPACE IF NOT EXISTS spring_cassandra" + + " WITH replication = {'class':'SimpleStrategy', 'replication_factor':3}"); + logger.info("the result -" + result); + assertTrue(result); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..ad4110c7e5 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java @@ -0,0 +1,45 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration; +import com.baeldung.connectiondetails.entity.elastic.Person; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomElasticsearchConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"}) +@ActiveProfiles("elastic") +public class ElasticsearchConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class); + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void prepare() { + if (elasticsearchTemplate.indexOps(Person.class).exists()) { + elasticsearchTemplate.indexOps(Person.class).delete(); + } + } + @Test + public void givenHashicorpVault_whenCreateIndexInElastic_thenSuccess() { + + Boolean result = elasticsearchTemplate.indexOps(Person.class).create(); + logger.info("index created:" + result); + assertTrue(result); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..748bc27b0b --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.sql.Date; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(JdbcConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"}) +@ActiveProfiles("jdbc") +public class JdbcConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class); + @Autowired + private JdbcTemplate jdbcTemplate; + @Test + public void givenSecretVault_whenIntegrateWithPostgres_thenConnectionSuccessful() { + String sql = "select current_date;"; + Date date = jdbcTemplate.queryForObject(sql, Date.class); + assertEquals(LocalDate.now().toString(), date.toString()); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..edd6da3448 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(MongoDBConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"}) +@ActiveProfiles("mongo") +public class MongoDBConnectionDetailsIntegrationTest { + + @Autowired + private MongoTemplate mongoTemplate; + @Test + public void givenMongoDB_whenExecuteQuery_ReturnResult() throws JSONException { + mongoTemplate.insert("{\"msg\":\"My First Entry in MongoDB\"}", "myDemoCollection"); + String result = mongoTemplate.find(new Query(), String.class, "myDemoCollection").get(0); + + JSONObject jsonObject = new JSONObject(result); + result = jsonObject.get("msg").toString(); + R2dbcAutoConfiguration r2dbcAutoConfiguration; + R2dbcDataAutoConfiguration r2dbcDataAutoConfiguration; + R2dbcRepositoriesAutoConfiguration r2dbcRepositoriesAutoConfiguration; + + assertEquals("My First Entry in MongoDB", result); + } +} + diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..88a9529822 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java @@ -0,0 +1,43 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration; +import com.baeldung.connectiondetails.entity.neo4j.Person; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.neo4j.core.Neo4jTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomNeo4jConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"}) +@ActiveProfiles("neo4j") +public class Neo4jConnectionDetailsIntegrationTest { + @Autowired + private Neo4jTemplate neo4jTemplate; + + @After + public void cleanup() { + neo4jTemplate.deleteAll(Person.class); + } + @Test + public void giveHashicorpVault_whenRunQuery_thenSuccess() { + Person person = new Person(); + person.setName("James"); + person.setZipcode("751003"); + + Person data = neo4jTemplate.save(person); + assertEquals("James", data.getName()); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..b24071a1f1 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java @@ -0,0 +1,40 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(R2dbcPostgresConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"}) +@ActiveProfiles("r2dbc") +public class R2dbcConnectionDetailsIntegrationTest { + Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class); + @Autowired + private R2dbcEntityTemplate r2dbcEntityTemplate; + + @Test + public void givenHashicorpVault_whenQueryPostgresReactive_thenSuccess() { + + String sql = "select * from information_schema.tables"; + + List result = r2dbcEntityTemplate.getDatabaseClient().sql(sql).fetch().all() + .map(r -> { + return "hello " + r.get("table_name").toString(); + + }).collectList().block(); + logger.info("count ------" + result.size()); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..2793ac0126 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java @@ -0,0 +1,62 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(RabbitMQConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"}) +@ActiveProfiles("rabbitmq") +public class RabbitmqConnectionDetailsIntegrationTest { + + private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class); + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private CachingConnectionFactory connectionFactory; + + private final static String queueName = "Test_Queue"; + + RabbitAdmin rabbitAdmin; + + @Before + public void setup() { + logger.info("create new queue"); + rabbitAdmin = new RabbitAdmin(connectionFactory); + logger.info("creating queue: " + rabbitAdmin.declareQueue(new Queue(queueName))); + connectionFactory.destroy(); + } + + @After + public void cleanup() { + logger.info("delete queue"); + this.rabbitAdmin.deleteQueue(queueName, false, true); + } + @Test + public void givenRabbitmq_whenPublishMessage_thenSuccess() { + logger.info("sending message to queue " + queueName); + final String MSG = "this is a test message"; + this.rabbitTemplate.convertAndSend(queueName, MSG); + assertEquals(MSG, this.rabbitTemplate.receiveAndConvert(queueName)); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..6ca963a261 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(RedisConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"}) +@ActiveProfiles("redis") +public class RedisCacheConnnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class); + + @Autowired + RedisTemplate redisTemplate; + + @Test + public void giveRedisCache_whenKeyVal_storeInCache() { + redisTemplate.opsForValue().set("City", "New York"); + assertEquals("New York", redisTemplate.opsForValue().get("City")); + } +} From 3ffb002aa2390cfb6f2daf5d5903e27612c0a219 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 5 Oct 2023 11:56:36 +0530 Subject: [PATCH 026/831] POM Indentation --- .../spring-boot-validations/pom.xml | 75 ++++++++++--------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/pom.xml b/spring-boot-modules/spring-boot-validations/pom.xml index e89c7f997b..9be58df247 100644 --- a/spring-boot-modules/spring-boot-validations/pom.xml +++ b/spring-boot-modules/spring-boot-validations/pom.xml @@ -1,38 +1,39 @@ - - 4.0.0 - - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - - spring-boot-validations - spring-boot-validations - Demo of Validations in Spring Boot - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-validation - - - org.projectlombok - lombok - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + 4.0.0 + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + spring-boot-validations + spring-boot-validations + Demo of Validations in Spring Boot + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-validation + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file From 505301d390f0215f50f898f414df6ca30c1336d0 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Thu, 5 Oct 2023 19:09:19 +0530 Subject: [PATCH 027/831] Review Comments --- .../spring-boot-validations/pom.xml | 4 - .../controller/ValidationController.java | 16 +++- .../GlobalExceptionHandler.java | 7 ++ .../java/com/baeldung/dto/BooleanObject.java | 35 ++++++++- .../baeldung/service/ValidationService.java | 2 +- .../ValidationControllerUnitTest.java | 73 +++++++++---------- .../com/baeldung/dto/BooleanUnitTest.java | 4 +- .../service/ValidationServiceUnitTest.java | 35 --------- 8 files changed, 90 insertions(+), 86 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java diff --git a/spring-boot-modules/spring-boot-validations/pom.xml b/spring-boot-modules/spring-boot-validations/pom.xml index 9be58df247..13044471af 100644 --- a/spring-boot-modules/spring-boot-validations/pom.xml +++ b/spring-boot-modules/spring-boot-validations/pom.xml @@ -23,10 +23,6 @@ org.springframework.boot spring-boot-starter-validation - - org.projectlombok - lombok - diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java index 8597c9617c..d4ea9a6336 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controller/ValidationController.java @@ -2,18 +2,32 @@ package com.baeldung.controller; import javax.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.baeldung.dto.BooleanObject; +import com.baeldung.service.ValidationService; @RestController public class ValidationController { + @Autowired + ValidationService service; + @PostMapping("/validateBoolean") - public ResponseEntity addUser(@RequestBody @Valid BooleanObject booleanObj) { + public ResponseEntity processBooleanObject(@RequestBody @Valid BooleanObject booleanObj) { + return ResponseEntity.ok("BooleanObject is valid"); + } + + @PostMapping("/validateBooleanAtService") + public ResponseEntity processBooleanObjectAtService() { + BooleanObject boolObj = new BooleanObject(); + boolObj.setBoolField(Boolean.TRUE); + boolObj.setTrueField(Boolean.FALSE); + service.processBoolean(boolObj); return ResponseEntity.ok("BooleanObject is valid"); } } diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java index 4c696cb70d..82f0839acf 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/controlleradvice/GlobalExceptionHandler.java @@ -2,6 +2,8 @@ package com.baeldung.controlleradvice; import java.util.stream.Collectors; +import javax.validation.ConstraintViolationException; + import org.springframework.http.HttpStatus; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -27,4 +29,9 @@ public class GlobalExceptionHandler { return ex.getMessage(); } + @ExceptionHandler(ConstraintViolationException.class) + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + public String handleConstraintViolationException(ConstraintViolationException ex) { + return ex.getMessage(); + } } diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java index 77ca18b02c..410324d3b5 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java @@ -7,9 +7,6 @@ import javax.validation.constraints.NotNull; import com.baeldung.deserializer.BooleanDeserializer; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import lombok.Data; - -@Data public class BooleanObject { @NotNull(message = "boolField cannot be null") @@ -23,4 +20,36 @@ public class BooleanObject { @JsonDeserialize(using = BooleanDeserializer.class) Boolean boolStringVar; + + public Boolean getBoolField() { + return boolField; + } + + public void setBoolField(Boolean boolField) { + this.boolField = boolField; + } + + public Boolean getTrueField() { + return trueField; + } + + public void setTrueField(Boolean trueField) { + this.trueField = trueField; + } + + public Boolean getFalseField() { + return falseField; + } + + public void setFalseField(Boolean falseField) { + this.falseField = falseField; + } + + public Boolean getBoolStringVar() { + return boolStringVar; + } + + public void setBoolStringVar(Boolean boolStringVar) { + this.boolStringVar = boolStringVar; + } } diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java index 5b96344e46..3fc7160bd5 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/service/ValidationService.java @@ -11,7 +11,7 @@ import com.baeldung.dto.BooleanObject; @Validated public class ValidationService { - public void validateBoolean(@Valid BooleanObject booleanObj) { + public void processBoolean(@Valid BooleanObject booleanObj) { // further processing } } diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index 73db4eb4eb..51cdb22780 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -8,27 +8,36 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; -import com.baeldung.dto.BooleanObject; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.baeldung.service.ValidationService; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = ValidationController.class) class ValidationControllerUnitTest { - @Autowired - private ObjectMapper objectMapper; - @Autowired private MockMvc mockMvc; + @TestConfiguration + static class EmployeeServiceImplTestContextConfiguration { + @Bean + public ValidationService validationService() { + return new ValidationService() { + }; + } + } + + @Autowired + ValidationService service; + @Test - void testNullBoolean() throws Exception { - BooleanObject boolObj = new BooleanObject(); - boolObj.setBoolField(null); - String postBody = objectMapper.writeValueAsString(boolObj); + void whenNullInputForBooleanField__thenHttpBadRequestAsHttpResponse() throws Exception { + + String postBody = "{\"boolField\":null,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) @@ -37,11 +46,9 @@ class ValidationControllerUnitTest { } @Test - void testTrueBoolean() throws Exception { - BooleanObject boolObj = new BooleanObject(); - boolObj.setBoolField(Boolean.TRUE); - boolObj.setTrueField(Boolean.FALSE); - String postBody = objectMapper.writeValueAsString(boolObj); + void whenInvalidInputForTrueBooleanField__thenErrorResponse() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":false,\"falseField\":false,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) @@ -53,12 +60,9 @@ class ValidationControllerUnitTest { } @Test - void testFalseBoolean() throws Exception { - BooleanObject boolObj = new BooleanObject(); - boolObj.setBoolField(Boolean.TRUE); - boolObj.setTrueField(Boolean.TRUE); - boolObj.setFalseField(Boolean.TRUE); - String postBody = objectMapper.writeValueAsString(boolObj); + void whenInvalidInputForFalseBooleanField__thenErrorResponse() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":true,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) @@ -70,25 +74,7 @@ class ValidationControllerUnitTest { } @Test - void testBooleanFromString() throws Exception { - BooleanObject boolObj = new BooleanObject(); - boolObj.setBoolField(Boolean.TRUE); - boolObj.setTrueField(Boolean.TRUE); - boolObj.setFalseField(Boolean.FALSE); - boolObj.setBoolStringVar(true); - String postBody = objectMapper.writeValueAsString(boolObj); - - String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") - .content(postBody)) - .andReturn() - .getResponse() - .getContentAsString(); - - assertEquals("Only values accepted as Boolean are + and -", output); - } - - @Test - void testInvalidBooleanFromJson() throws Exception { + void whenInvalidBooleanFromJson_thenErrorResponse() throws Exception { String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"plus\"}"; @@ -103,7 +89,7 @@ class ValidationControllerUnitTest { } @Test - void testValidBean() throws Exception { + void whenAllBooleanFieldsValid_thenCorrectResponse() throws Exception { String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; @@ -116,4 +102,11 @@ class ValidationControllerUnitTest { assertEquals("BooleanObject is valid", output); } + + @Test + void givenAllBooleanFieldsValid_whenServiceValidationFails_thenErrorResponse() throws Exception { + + mockMvc.perform(post("/validateBooleanAtService").contentType("application/json")) + .andExpect(status().isInternalServerError()); + } } diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java index 8c9375e72f..30270ee512 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; class BooleanUnitTest { @Test - void testBooleanFromString() { + void givenInputAsString_whenStringToBoolean_thenValidBooleanConversion() { Boolean trueVar = Boolean.valueOf("TRUE"); Boolean falseVar = Boolean.valueOf("false"); Boolean parsedVar = Boolean.parseBoolean("True"); @@ -18,7 +18,7 @@ class BooleanUnitTest { } @Test - void testBoolean() { + void givenInputAsboolean_whenbooleanToBoolean_thenValidBooleanConversion() { Boolean trueVar = Boolean.valueOf(true); Boolean falseVar = Boolean.valueOf(false); diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java deleted file mode 100644 index c67acea13d..0000000000 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/service/ValidationServiceUnitTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.service; - -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import javax.validation.ConstraintViolationException; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import com.baeldung.dto.BooleanObject; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -class ValidationServiceUnitTest { - - @Autowired - ValidationService service; - - @Test - void validateBoolean() { - BooleanObject boolObj = new BooleanObject(); - boolObj.setBoolField(Boolean.valueOf(true)); - boolObj.setTrueField(Boolean.FALSE); - Throwable throwableError = assertThrows(ConstraintViolationException.class, () -> { - service.validateBoolean(boolObj); - }); - assertTrue(throwableError.getLocalizedMessage() - .endsWith("trueField must have true value")); - } - -} From ac9f71f09048d84bd699beeeee12fda4e9647bbb Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Thu, 5 Oct 2023 21:01:22 +0200 Subject: [PATCH 028/831] BAEL-3438: migrate to junit5, added small changes --- .../spring-data-jpa-enterprise/pom.xml | 13 ++++- .../src/main/resources/application.properties | 1 + .../boot/daos/UserRepositoryCommon.java | 15 +++--- .../daos/UserRepositoryIntegrationTest.java | 6 +-- .../daos/UserRepositoryTCAutoLiveTest.java | 11 ++-- .../daos/UserRepositoryTCJdbcLiveTest.java | 24 ++++----- .../boot/daos/UserRepositoryTCLiveTest.java | 54 ++++++++----------- 7 files changed, 63 insertions(+), 61 deletions(-) diff --git a/persistence-modules/spring-data-jpa-enterprise/pom.xml b/persistence-modules/spring-data-jpa-enterprise/pom.xml index 16294cd3cc..6bd89032fa 100644 --- a/persistence-modules/spring-data-jpa-enterprise/pom.xml +++ b/persistence-modules/spring-data-jpa-enterprise/pom.xml @@ -54,6 +54,11 @@ spring-security-test test + + org.postgresql + postgresql + runtime + org.testcontainers @@ -61,6 +66,12 @@ ${testcontainers.version} test + + org.testcontainers + junit-jupiter + ${testcontainers.version} + test + @@ -87,7 +98,7 @@ 1.3.1.Final - 1.17.3 + 1.19.1 \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties index 0ca1872207..a6733dc397 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties @@ -12,4 +12,5 @@ spring.datasource.url=jdbc:h2:mem:baeldung spring.jpa.show-sql=false #hibernate.dialect=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto= create spring.jpa.properties.hibernate.id.new_generator_mappings=false \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java index e8841d921c..45be598153 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java @@ -1,8 +1,9 @@ package com.baeldung.boot.daos; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -25,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.*; +@SpringBootTest public class UserRepositoryCommon { final String USER_EMAIL = "email@example.com"; @@ -274,7 +276,7 @@ public class UserRepositoryCommon { .getName()).isEqualTo(USER_NAME_ADAM); } - @Test(expected = PropertyReferenceException.class) + @Test public void givenUsersInDB_WhenFindAllSortWithFunction_ThenThrowException() { userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS)); userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS)); @@ -282,10 +284,7 @@ public class UserRepositoryCommon { userRepository.findAll(Sort.by(Sort.Direction.ASC, "name")); - List usersSortByNameLength = userRepository.findAll(Sort.by("LENGTH(name)")); - - assertThat(usersSortByNameLength.get(0) - .getName()).isEqualTo(USER_NAME_ADAM); + assertThrows(PropertyReferenceException.class, () -> userRepository.findAll(Sort.by("LENGTH(name)"))); } @Test @@ -556,7 +555,7 @@ public class UserRepositoryCommon { assertEquals(0, nativeQuery.getResultList().get(0)); } - @After + @AfterEach public void cleanUp() { userRepository.deleteAll(); } diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryIntegrationTest.java index 1b1d264574..c4d9d65746 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryIntegrationTest.java @@ -2,11 +2,10 @@ package com.baeldung.boot.daos; import com.baeldung.boot.Application; import com.baeldung.boot.domain.User; -import org.junit.Test; -import org.junit.runner.RunWith; + +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; @@ -16,7 +15,6 @@ import static org.assertj.core.api.Assertions.assertThat; /** * Created by adam. */ -@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) @DirtiesContext public class UserRepositoryIntegrationTest extends UserRepositoryCommon { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java index 99eabc8271..056b3cea28 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java @@ -3,14 +3,15 @@ package com.baeldung.boot.daos; import com.baeldung.boot.Application; import com.baeldung.boot.domain.User; import com.baeldung.util.BaeldungPostgresqlContainer; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.runner.RunWith; + +import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import java.time.LocalDate; @@ -19,12 +20,12 @@ import static org.assertj.core.api.Assertions.assertThat; /** * Created by adam. */ -@RunWith(SpringRunner.class) +@Testcontainers @SpringBootTest(classes = Application.class) @ActiveProfiles({"tc", "tc-auto"}) public class UserRepositoryTCAutoLiveTest extends UserRepositoryCommon { - @ClassRule + @Container public static PostgreSQLContainer postgreSQLContainer = BaeldungPostgresqlContainer.getInstance(); @Test diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCJdbcLiveTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCJdbcLiveTest.java index c976590966..f4af7284bd 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCJdbcLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCJdbcLiveTest.java @@ -1,21 +1,21 @@ package com.baeldung.boot.daos; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + import com.baeldung.boot.Application; import com.baeldung.boot.daos.user.UserRepository; import com.baeldung.boot.domain.User; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(SpringRunner.class) @ActiveProfiles("tc-jdbc") @SpringBootTest(classes = Application.class) public class UserRepositoryTCJdbcLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java index be8843c166..33f4bbeeff 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java @@ -1,33 +1,29 @@ package com.baeldung.boot.daos; -import com.baeldung.boot.Application; -import com.baeldung.boot.domain.User; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.util.TestPropertyValues; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; -import org.testcontainers.containers.PostgreSQLContainer; - -import java.time.LocalDate; - import static org.assertj.core.api.Assertions.assertThat; -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.transaction.annotation.Transactional; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import com.baeldung.boot.domain.User; + +@Testcontainers +@SpringBootTest @ActiveProfiles("tc") -@ContextConfiguration(initializers = {UserRepositoryTCLiveTest.Initializer.class}) public class UserRepositoryTCLiveTest extends UserRepositoryCommon { - @ClassRule + @Container public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1") - .withDatabaseName("integration-tests-db") + .withDatabaseName("integration-tests-db") .withUsername("sa") .withPassword("sa"); @@ -45,14 +41,10 @@ public class UserRepositoryTCLiveTest extends UserRepositoryCommon { assertThat(updatedUsersSize).isEqualTo(2); } - static class Initializer - implements ApplicationContextInitializer { - public void initialize(ConfigurableApplicationContext configurableApplicationContext) { - TestPropertyValues.of( - "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(), - "spring.datasource.username=" + postgreSQLContainer.getUsername(), - "spring.datasource.password=" + postgreSQLContainer.getPassword() - ).applyTo(configurableApplicationContext.getEnvironment()); - } + @DynamicPropertySource + static void registerPgProperties(DynamicPropertyRegistry registry) { + registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl); + registry.add("spring.datasource.username", postgreSQLContainer::getUsername); + registry.add("spring.datasource.password", postgreSQLContainer::getPassword); } } From 7854c7336b2c329e6525b118a7648abd6a628c5b Mon Sep 17 00:00:00 2001 From: Maiklins Date: Thu, 5 Oct 2023 23:54:24 +0200 Subject: [PATCH 029/831] Remove double underscores from test names --- .../baeldung/controller/ValidationControllerUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index 51cdb22780..759007ed36 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -35,7 +35,7 @@ class ValidationControllerUnitTest { ValidationService service; @Test - void whenNullInputForBooleanField__thenHttpBadRequestAsHttpResponse() throws Exception { + void whenNullInputForBooleanField_thenHttpBadRequestAsHttpResponse() throws Exception { String postBody = "{\"boolField\":null,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; @@ -46,7 +46,7 @@ class ValidationControllerUnitTest { } @Test - void whenInvalidInputForTrueBooleanField__thenErrorResponse() throws Exception { + void whenInvalidInputForTrueBooleanField_thenErrorResponse() throws Exception { String postBody = "{\"boolField\":true,\"trueField\":false,\"falseField\":false,\"boolStringVar\":\"+\"}"; @@ -60,7 +60,7 @@ class ValidationControllerUnitTest { } @Test - void whenInvalidInputForFalseBooleanField__thenErrorResponse() throws Exception { + void whenInvalidInputForFalseBooleanField_thenErrorResponse() throws Exception { String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":true,\"boolStringVar\":\"+\"}"; From 5c8a1373498a1eed20a14085863c63327fa8a3c9 Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Fri, 6 Oct 2023 17:48:47 +0530 Subject: [PATCH 030/831] JAVA-18764: Chnages made for applcation.yml file --- .../src/main/resources/application.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/security-modules/cas/cas-server/src/main/resources/application.yml b/security-modules/cas/cas-server/src/main/resources/application.yml index 0c4e4ffde2..0fd72c539d 100644 --- a/security-modules/cas/cas-server/src/main/resources/application.yml +++ b/security-modules/cas/cas-server/src/main/resources/application.yml @@ -8,3 +8,19 @@ server: spring: main: allow-bean-definition-overriding: true +cas: + authn: + accept: + users: + jdbc: + query[0]: + sql: SELECT * FROM users WHERE email = ? + url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC + dialect: org.hibernate.dialect.MySQLDialect + user: root + password: root1234 + ddlAuto: none + driverClass: com.mysql.cj.jdbc.Driver + fieldPassword: password + passwordEncoder: + type: NONE From 27e89503fa9cf3d2d49dffe5c145e208c793097c Mon Sep 17 00:00:00 2001 From: Alvin Austria Date: Fri, 6 Oct 2023 23:12:32 +0200 Subject: [PATCH 031/831] JAVA-20429 : Used URI constructions instead of the deprecated URL constructors. --- .../baeldung/networking/url/UrlUnitTest.java | 114 ++++++++++-------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java index 87d9d7a620..2db6ee8e34 100644 --- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java +++ b/core-java-modules/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java @@ -4,12 +4,14 @@ import static java.util.stream.Collectors.toList; import static org.junit.Assert.assertEquals; import java.net.MalformedURLException; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import org.apache.http.client.utils.URIBuilder; import org.apache.http.message.BasicNameValuePair; +import org.junit.Assert; import org.junit.Test; import org.springframework.web.util.UriComponentsBuilder; @@ -18,95 +20,101 @@ import com.google.common.collect.ImmutableMap; public class UrlUnitTest { @Test - public void givenUrl_whenCanIdentifyProtocol_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com"); + public void givenUrl_whenCanIdentifyProtocol_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com").toURL(); assertEquals("http", url.getProtocol()); } @Test - public void givenUrl_whenCanGetHost_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com"); + public void givenUrl_whenCanGetHost_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com").toURL(); assertEquals("baeldung.com", url.getHost()); } @Test - public void givenUrl_whenCanGetFileName_thenCorrect2() throws MalformedURLException { - final URL url = new URL("http://baeldung.com/articles?topic=java&version=8"); + public void givenUrl_whenCanGetFileName_thenCorrect2() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com/articles?topic=java&version=8").toURL(); assertEquals("/articles?topic=java&version=8", url.getFile()); } @Test - public void givenUrl_whenCanGetFileName_thenCorrect1() throws MalformedURLException { - final URL url = new URL("http://baeldung.com/guidelines.txt"); + public void givenUrl_whenCanGetFileName_thenCorrect1() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com/guidelines.txt").toURL(); assertEquals("/guidelines.txt", url.getFile()); } @Test - public void givenUrl_whenCanGetPathParams_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com/articles?topic=java&version=8"); + public void givenUrl_whenCanGetPathParams_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com/articles?topic=java&version=8").toURL(); assertEquals("/articles", url.getPath()); } @Test - public void givenUrl_whenCanGetQueryParams_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com/articles?topic=java"); - assertEquals("topic=java", url.getQuery()); + public void givenUrl_whenCanGetQueryParams_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com/articles?topic=java&version=8").toURL(); + assertEquals("topic=java&version=8", url.getQuery()); } @Test - public void givenUrl_whenGetsDefaultPort_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com"); + public void givenUrl_whenGetsDefaultPort_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com").toURL(); assertEquals(-1, url.getPort()); assertEquals(80, url.getDefaultPort()); } @Test - public void givenUrl_whenGetsPort_thenCorrect() throws MalformedURLException { - final URL url = new URL("http://baeldung.com:8090"); + public void givenUrl_whenGetsPort_thenCorrect() throws MalformedURLException, URISyntaxException { + final URL url = new URI("http://baeldung.com:8090").toURL(); assertEquals(8090, url.getPort()); assertEquals(80, url.getDefaultPort()); } @Test - public void givenBaseUrl_whenCreatesRelativeUrl_thenCorrect() throws MalformedURLException { - final URL baseUrl = new URL("http://baeldung.com"); - final URL relativeUrl = new URL(baseUrl, "a-guide-to-java-sockets"); - assertEquals("http://baeldung.com/a-guide-to-java-sockets", relativeUrl.toString()); + public void givenHomeUrlAndFullUrl_whenRelativize_thenCorrect() throws MalformedURLException, URISyntaxException { + final URI homeUri = new URI("http://baeldung.com"); + final URI fullUri = new URI("http://baeldung.com" + "/a-guide-to-java-sockets"); + final URI relativeUri = homeUri.relativize(fullUri); + assertEquals("a-guide-to-java-sockets", relativeUri.toString()); } @Test - public void givenAbsoluteUrl_whenIgnoresBaseUrl_thenCorrect() throws MalformedURLException { - final URL baseUrl = new URL("http://baeldung.com"); - final URL relativeUrl = new URL(baseUrl, "http://baeldung.com/a-guide-to-java-sockets"); - assertEquals("http://baeldung.com/a-guide-to-java-sockets", relativeUrl.toString()); - } - - @Test - public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect() throws MalformedURLException { + public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect() throws MalformedURLException, URISyntaxException { final String protocol = "http"; final String host = "baeldung.com"; final String file = "/guidelines.txt"; - final URL url = new URL(protocol, host, file); - assertEquals("http://baeldung.com/guidelines.txt", url.toString()); + final String fragment = "myImage"; + final URL url = new URI(protocol, host, file, fragment).toURL(); + assertEquals("http://baeldung.com/guidelines.txt#myImage", url.toString()); } @Test - public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect2() throws MalformedURLException { + public void givenUrlComponents_whenConstructsCompleteUrl_thenCorrect2() throws MalformedURLException, URISyntaxException { final String protocol = "http"; + final String username = "admin"; final String host = "baeldung.com"; - final String file = "/articles?topic=java&version=8"; - final URL url = new URL(protocol, host, file); - assertEquals("http://baeldung.com/articles?topic=java&version=8", url.toString()); + final String file = "/articles"; + final String query = "topic=java&version=8"; + final String fragment = "myImage"; + final URL url = new URI(protocol, username, host, -1, file, query, fragment).toURL(); + assertEquals("http://admin@baeldung.com/articles?topic=java&version=8#myImage", url.toString()); } @Test - public void givenUrlComponentsWithPort_whenConstructsCompleteUrl_thenCorrect() throws MalformedURLException { + public void givenRelativeUrl_whenCreatesRelativeUrl_thenThrows() throws URISyntaxException, MalformedURLException { + final URI uri = new URI("/a-guide-to-java-sockets"); + Assert.assertThrows(IllegalArgumentException.class, () -> uri.toURL()); + } + + @Test + public void givenUrlComponentsWithPort_whenConstructsCompleteUrl_thenCorrect() throws MalformedURLException, URISyntaxException { final String protocol = "http"; + final String username = "admin"; final String host = "baeldung.com"; final int port = 9000; final String file = "/guidelines.txt"; - final URL url = new URL(protocol, host, port, file); - assertEquals("http://baeldung.com:9000/guidelines.txt", url.toString()); + final String fragment = "myImage"; + final URL url = new URI(protocol, username, host, port, file, null, fragment).toURL(); + assertEquals("http://admin@baeldung.com:9000/guidelines.txt#myImage", url.toString()); } @Test @@ -115,7 +123,8 @@ public class UrlUnitTest { uriBuilder.setPort(9090); uriBuilder.addParameter("topic", "java"); uriBuilder.addParameter("version", "8"); - URL url = uriBuilder.build().toURL(); + URL url = uriBuilder.build() + .toURL(); assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); } @@ -125,26 +134,27 @@ public class UrlUnitTest { URIBuilder uriBuilder = new URIBuilder("http://baeldung.com/articles"); uriBuilder.setPort(9090); uriBuilder.addParameters(paramMap.entrySet() - .stream() - .map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue())) - .collect(toList())); + .stream() + .map(entry -> new BasicNameValuePair(entry.getKey(), entry.getValue())) + .collect(toList())); - URL url = uriBuilder.build().toURL(); + URL url = uriBuilder.build() + .toURL(); assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); } @Test public void givenUrlParameters_whenBuildUrlWithSpringUriComponentsBuilder_thenSuccess() throws MalformedURLException { URL url = UriComponentsBuilder.newInstance() - .scheme("http") - .host("baeldung.com") - .port(9090) - .path("articles") - .queryParam("topic", "java") - .queryParam("version", "8") - .build() - .toUri() - .toURL(); + .scheme("http") + .host("baeldung.com") + .port(9090) + .path("articles") + .queryParam("topic", "java") + .queryParam("version", "8") + .build() + .toUri() + .toURL(); assertEquals("http://baeldung.com:9090/articles?topic=java&version=8", url.toString()); } From aa2af965ced61e182b6944d69a53c291e0b89324 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 7 Oct 2023 00:48:51 +0300 Subject: [PATCH 032/831] [JAVA-15965] Upgraded json version to 20230618 --- json-modules/json-2/pom.xml | 1 - json-modules/json-arrays/pom.xml | 1 - json-modules/json-conversion/pom.xml | 1 - json-modules/json/pom.xml | 1 - json-modules/pom.xml | 4 ++++ 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/json-modules/json-2/pom.xml b/json-modules/json-2/pom.xml index 7253088516..6cca576fb1 100644 --- a/json-modules/json-2/pom.xml +++ b/json-modules/json-2/pom.xml @@ -237,7 +237,6 @@ 0.9.23 1.9.2 1.2.21 - 20211205 1.1.1 0.1.1 0.4.2 diff --git a/json-modules/json-arrays/pom.xml b/json-modules/json-arrays/pom.xml index 0eefbc86fc..10c487fbda 100644 --- a/json-modules/json-arrays/pom.xml +++ b/json-modules/json-arrays/pom.xml @@ -38,7 +38,6 @@ 1.0 - 20230227 2.8.5 1.1.2 2.28.0 diff --git a/json-modules/json-conversion/pom.xml b/json-modules/json-conversion/pom.xml index 680f27fa38..638216f4c5 100644 --- a/json-modules/json-conversion/pom.xml +++ b/json-modules/json-conversion/pom.xml @@ -37,7 +37,6 @@ - 20211205 2.10.1 32.1.2-jre diff --git a/json-modules/json/pom.xml b/json-modules/json/pom.xml index 8210f026e7..27c9262279 100644 --- a/json-modules/json/pom.xml +++ b/json-modules/json/pom.xml @@ -68,7 +68,6 @@ 1.0.72 1.0 1.0.1 - 20230227 2.8.5 1.1.2 2.28.0 diff --git a/json-modules/pom.xml b/json-modules/pom.xml index 306b404049..7ac6ba19ad 100644 --- a/json-modules/pom.xml +++ b/json-modules/pom.xml @@ -34,4 +34,8 @@ + + 20230618 + + \ No newline at end of file From 0c1ea7ae7722b39f7ae343dd6ffa6174ec3e8d95 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 7 Oct 2023 01:12:13 +0300 Subject: [PATCH 033/831] [JAVA-25962] Upgraded joda-time version to 2.12.5 --- core-java-modules/core-java-datetime-string/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-datetime-string/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml index 3efb2fe728..a33114852c 100644 --- a/core-java-modules/core-java-datetime-string/pom.xml +++ b/core-java-modules/core-java-datetime-string/pom.xml @@ -65,7 +65,7 @@ 1.6 - 2.10.10 + 2.12.5 RELEASE 1.9 1.9 From af8cd8080f8558523b0c1ccda8886840da75d0bc Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 7 Oct 2023 01:28:02 +0300 Subject: [PATCH 034/831] [JAVA-25958] Upgraded jackson-dataformat-xml version to 2.15.2 --- jackson-simple/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index d01c43dc90..3bf523bbfa 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -33,7 +33,7 @@ - 2.14.2 + 2.15.2 17 From 92a8290fc810015ea9cb03c841eaaf34103ee52a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 7 Oct 2023 13:52:12 +0530 Subject: [PATCH 035/831] JAVA-25489 Upgrade to Spring Boot 3 --- spring-boot-modules/spring-boot-keycloak/pom.xml | 9 +++++---- .../src/main/java/com/baeldung/keycloak/Customer.java | 8 ++++---- .../com/baeldung/keycloak/KeycloakLogoutHandler.java | 4 ++-- .../main/java/com/baeldung/keycloak/SecurityConfig.java | 5 +++-- .../main/java/com/baeldung/keycloak/WebController.java | 2 +- .../java/com/baeldung/keycloaksoap/ProductsEndpoint.java | 2 +- .../com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java | 2 +- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml index bada9ab52d..8ef6f274eb 100644 --- a/spring-boot-modules/spring-boot-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-keycloak/pom.xml @@ -11,9 +11,10 @@ This is a simple application demonstrating integration between Keycloak and Spring Boot. - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -105,7 +106,7 @@ com.baeldung.keycloak.SpringBoot 4.0.0 1.6.3 - 2.5.0 + 3.1.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/Customer.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/Customer.java index 3293446b1d..b0aff5e724 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/Customer.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/Customer.java @@ -1,9 +1,9 @@ package com.baeldung.keycloak; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Customer { diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java index 06c41e9b1d..d04fff8378 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/KeycloakLogoutHandler.java @@ -10,8 +10,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; @Component public class KeycloakLogoutHandler implements LogoutHandler { diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java index 3423f8eb2b..eb7767480f 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java @@ -12,6 +12,7 @@ import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity @@ -32,7 +33,7 @@ class SecurityConfig { @Bean public SecurityFilterChain clientFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/") + .requestMatchers(new AntPathRequestMatcher("/")) .permitAll() .anyRequest() .authenticated(); @@ -48,7 +49,7 @@ class SecurityConfig { @Bean public SecurityFilterChain resourceServerFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/customers*") + .requestMatchers(new AntPathRequestMatcher("/customers*")) .hasRole("USER") .anyRequest() .authenticated(); diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java index bbd96c8135..8843aee25a 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/WebController.java @@ -8,7 +8,7 @@ import java.security.Principal; import org.springframework.beans.factory.annotation.Autowired; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; @Controller public class WebController { diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/ProductsEndpoint.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/ProductsEndpoint.java index 58f7739af0..b072789078 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/ProductsEndpoint.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/ProductsEndpoint.java @@ -10,7 +10,7 @@ import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.RequestPayload; import org.springframework.ws.server.endpoint.annotation.ResponsePayload; -import javax.annotation.security.RolesAllowed; +import jakarta.annotation.security.RolesAllowed; import java.util.Map; @Endpoint diff --git a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java index 171c7bf330..508061396f 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java +++ b/spring-boot-modules/spring-boot-keycloak/src/test/java/com/baeldung/keycloaksoap/KeycloakSoapLiveTest.java @@ -10,7 +10,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; From 1b1ba05a505ab99243ebf2aebfde9cb2ebc94c95 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 7 Oct 2023 12:44:06 +0100 Subject: [PATCH 036/831] Update HttpSecurityConfig.java --- .../httpsecurityvswebsecurity/HttpSecurityConfig.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java index 19ffa2fdb3..bfa8fa8633 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java @@ -14,16 +14,16 @@ public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { // Given: HttpSecurity configured http - .authorizeRequests() + .authorizeRequests() .antMatchers("/public/**").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() - .and() - .formLogin() + .and() + .formLogin() .loginPage("/login") .permitAll() - .and() - .logout() + .and() + .logout() .permitAll(); // When: Accessing specific URLs From 8177e7430718f3350234bff68cabbd738358673b Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 7 Oct 2023 12:49:07 +0100 Subject: [PATCH 037/831] Update WebSecurityConfig.java --- .../httpsecurityvswebsecurity/WebSecurityConfig.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 11b740c744..9d0a3cfb55 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -17,15 +17,18 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); + auth + .userDetailsService(userDetailsService) + .passwordEncoder(new BCryptPasswordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() + http + .authorizeRequests() .antMatchers("/").permitAll() .anyRequest().authenticated() - .and() - .formLogin(); + .and() + .formLogin(); } } From 78d0fa3656aec1f42290eb23ac8f31ffe902b13a Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sat, 7 Oct 2023 22:47:58 +0530 Subject: [PATCH 038/831] Updated Junits --- .../java/com/baeldung/dto/BooleanObject.java | 1 + .../ValidationControllerUnitTest.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java index 410324d3b5..750b23fe11 100644 --- a/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java +++ b/spring-boot-modules/spring-boot-validations/src/main/java/com/baeldung/dto/BooleanObject.java @@ -15,6 +15,7 @@ public class BooleanObject { @AssertTrue(message = "trueField must have true value") Boolean trueField; + @NotNull(message = "falseField cannot be null") @AssertFalse(message = "falseField must have false value") Boolean falseField; diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index 759007ed36..ad0e3ecdfa 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -109,4 +109,30 @@ class ValidationControllerUnitTest { mockMvc.perform(post("/validateBooleanAtService").contentType("application/json")) .andExpect(status().isInternalServerError()); } + + @Test + void whenNullInputForTrueBooleanField_thenCorrectResponse() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":null,\"falseField\":false,\"boolStringVar\":\"+\"}"; + + mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andExpect(status().isOk()); + + } + + @Test + void whenNullInputForFalseBooleanField_thenHttpBadRequestAsHttpResponse() throws Exception { + + String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":null,\"boolStringVar\":\"+\"}"; + + String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") + .content(postBody)) + .andReturn() + .getResponse() + .getContentAsString(); + + assertEquals("falseField cannot be null", output); + + } } From 05f4487d6357ebfc6eb017b026483876a9e6bd02 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Sun, 8 Oct 2023 05:12:47 +0700 Subject: [PATCH 039/831] [Update] no need to be public --- .../CompletableFutureTimeoutUnitTest.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 43b8075ebd..99f572f25a 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -14,14 +14,15 @@ import java.util.concurrent.*; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -public class CompletableFutureTimeoutUnitTest { + +class CompletableFutureTimeoutUnitTest { private static WireMockServer wireMockServer; private static ScheduledExecutorService executorService; private static final int DEFAULT_TIMEOUT = 1000; //1 seconds private static final int TIMEOUT_STATUS_CODE = 408; //0.5 seconds @BeforeAll - public static void setUp() { + static void setUp() { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); @@ -36,7 +37,7 @@ public class CompletableFutureTimeoutUnitTest { @AfterAll - public static void tearDown() { + static void tearDown() { executorService.shutdown(); wireMockServer.stop(); } @@ -58,14 +59,14 @@ public class CompletableFutureTimeoutUnitTest { } @Test - public void whenorTimeout_thenGetThrow() { + void whenorTimeout_thenGetThrow() { CompletableFuture completableFuture = createDummyRequest() .orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); assertThrows(ExecutionException.class, completableFuture::get); } @Test - public void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { + void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { CompletableFuture completableFuture = createDummyRequest() .completeOnTimeout(TIMEOUT_STATUS_CODE, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); @@ -73,7 +74,7 @@ public class CompletableFutureTimeoutUnitTest { } @Test - public void whencompleteExceptionally_thenGetThrow() { + void whencompleteExceptionally_thenGetThrow() { CompletableFuture completableFuture = createDummyRequest(); executorService.schedule(() -> completableFuture .completeExceptionally(new TimeoutException("Timeout occurred")), DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); From 5c9ed2e7b2502cab3aaf2962063070f425cdaa63 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 8 Oct 2023 01:13:47 +0300 Subject: [PATCH 040/831] [JAVA-25959] Upgraded spring-doc version --- spring-boot-modules/spring-boot-springdoc-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-springdoc-2/pom.xml b/spring-boot-modules/spring-boot-springdoc-2/pom.xml index 1ea52667c5..dace3d17ef 100644 --- a/spring-boot-modules/spring-boot-springdoc-2/pom.xml +++ b/spring-boot-modules/spring-boot-springdoc-2/pom.xml @@ -112,7 +112,7 @@ - 2.1.0 + 2.2.0 1.4 From b8bf616f3ee493cdb1ec67e4a343fb4777f30712 Mon Sep 17 00:00:00 2001 From: Ashley Frieze Date: Wed, 27 Sep 2023 20:08:05 +0100 Subject: [PATCH 041/831] Added JRE exclusion --- testing-modules/testing-libraries-2/pom.xml | 2 +- .../EnvironmentVariablesByAbstractionUnitTest.java | 3 +-- .../EnvironmentVariablesSetDirectlyUnitTest.java | 4 +++- .../EnvironmentVariablesSystemStubsTestNGUnitTest.java | 3 +-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml index b436b087f8..717ccac2b2 100644 --- a/testing-modules/testing-libraries-2/pom.xml +++ b/testing-modules/testing-libraries-2/pom.xml @@ -169,7 +169,7 @@ 0.8.6 1.19.0 1.0.0 - 2.1.2 + 2.1.3 7.8.0 3.24.2 2.1.0 diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java index b54fb6d24c..0ac0603c64 100644 --- a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesByAbstractionUnitTest.java @@ -32,7 +32,6 @@ class EnvironmentVariablesByAbstractionUnitTest { fakeEnv.put("OS", "MacDowsNix"); ReadsEnvironment reader = new ReadsEnvironment(fakeEnv::get); - assertThat(reader.whatOs()) - .isEqualTo("MacDowsNix"); + assertThat(reader.whatOs()).isEqualTo("MacDowsNix"); } } diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java index 7cc661e976..61a3ca3c2e 100644 --- a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSetDirectlyUnitTest.java @@ -2,12 +2,14 @@ package com.baeldung.environmentvariablesfortest; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import java.lang.reflect.Field; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -// This test can only work well in Java 15 and below +@EnabledForJreRange(min = JRE.JAVA_8, max = JRE.JAVA_16) class EnvironmentVariablesSetDirectlyUnitTest { @BeforeAll static void beforeAll() throws Exception { diff --git a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java index e78c8be826..61ca76a8b0 100644 --- a/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java +++ b/testing-modules/testing-libraries-2/src/test/java/com/baeldung/environmentvariablesfortest/EnvironmentVariablesSystemStubsTestNGUnitTest.java @@ -20,8 +20,7 @@ public class EnvironmentVariablesSystemStubsTestNGUnitTest { @Test public void givenEnvironmentVariableWasSet_thenItCanBeRead() { - assertThat(System.getenv("testng")) - .isEqualTo("has environment variables"); + assertThat(System.getenv("testng")).isEqualTo("has environment variables"); } } From 92d038dc3caca20feb9cd72293fbca02e99daca6 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Sun, 8 Oct 2023 20:33:43 +0700 Subject: [PATCH 042/831] add default --- .../CompletableFutureTimeoutUnitTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 99f572f25a..f41730f7df 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -81,4 +81,16 @@ class CompletableFutureTimeoutUnitTest { assertThrows(ExecutionException.class, completableFuture::get); } + @Test + void whencompletableDefault_thenGetReturn() { + CompletableFuture completableFuture = createDummyRequest(); + try { + int result = completableFuture.get(); + assertEquals(TIMEOUT_STATUS_CODE, result); + } catch (InterruptedException | ExecutionException e) { + //System.out.println("ERROR->"+e.getMessage()); + throw new RuntimeException(e); + } + } + } From 2026c298f973e7a4474eb19d10500c79177d5fa3 Mon Sep 17 00:00:00 2001 From: hmdrzsharifi Date: Sun, 8 Oct 2023 17:19:24 +0330 Subject: [PATCH 043/831] #BAEL-6912: add appender and logger --- .../logback/src/test/resources/logback-test.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/logging-modules/logback/src/test/resources/logback-test.xml b/logging-modules/logback/src/test/resources/logback-test.xml index 89c0124738..24082a673d 100644 --- a/logging-modules/logback/src/test/resources/logback-test.xml +++ b/logging-modules/logback/src/test/resources/logback-test.xml @@ -19,10 +19,18 @@ + + + + + + + + From 834414cab45f72a74d7c4e78a0349c3652383374 Mon Sep 17 00:00:00 2001 From: hmdrzsharifi Date: Sun, 8 Oct 2023 17:19:44 +0330 Subject: [PATCH 044/831] #BAEL-6912: add unit test --- .../baeldung/logback/JSONLayoutIntegrationTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutIntegrationTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutIntegrationTest.java index 06962c1ea1..f012769710 100644 --- a/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutIntegrationTest.java +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutIntegrationTest.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class JSONLayoutIntegrationTest { private static Logger logger; + private static Logger jsonlogger; private ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); private PrintStream ps = new PrintStream(consoleOutput); @@ -23,16 +24,24 @@ public class JSONLayoutIntegrationTest { public void setUp() { // Redirect console output to our stream System.setOut(ps); - logger = LoggerFactory.getLogger("jsonLogger"); } @Test - public void whenLogLayoutInJSON_thenOutputIsCorrectJSON() { + public void givenJsonLayout_whenLogInJSON_thenOutputIsCorrectJSON() { + logger = LoggerFactory.getLogger("jsonLogger"); logger.debug("Debug message"); String currentLog = consoleOutput.toString(); assertTrue(!currentLog.isEmpty() && isValidJSON(currentLog)); } + @Test + public void givenJsonEncoder_whenLogInJSON_thenOutputIsCorrectJSON() { + jsonlogger = LoggerFactory.getLogger("jsonEncoderLogger"); + jsonlogger.debug("Debug message"); + String currentLog = consoleOutput.toString(); + assertTrue(!currentLog.isEmpty() && isValidJSON(currentLog)); + } + public static boolean isValidJSON(String jsonInString) { try { final ObjectMapper mapper = new ObjectMapper(); From 385d969b7ccb2a0ef82fb176e9ddfe7eccaa36e1 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 8 Oct 2023 21:20:41 +0300 Subject: [PATCH 045/831] [JAVA-25960] Upgraded junit-jupiter & junit-platform version --- testing-modules/junit5-annotations/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml index 847baa827c..3a7ab1aa87 100644 --- a/testing-modules/junit5-annotations/pom.xml +++ b/testing-modules/junit5-annotations/pom.xml @@ -45,6 +45,8 @@ + 1.10.0 + 5.10.0 2.19.0 From 70e6dcd47b4eea4c9f6b57265ff114f4d5f03644 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Mon, 9 Oct 2023 20:16:40 +0700 Subject: [PATCH 046/831] non static --- .../CompletableFutureTimeoutUnitTest.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index f41730f7df..449ebc5bbc 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -80,17 +80,4 @@ class CompletableFutureTimeoutUnitTest { .completeExceptionally(new TimeoutException("Timeout occurred")), DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); assertThrows(ExecutionException.class, completableFuture::get); } - - @Test - void whencompletableDefault_thenGetReturn() { - CompletableFuture completableFuture = createDummyRequest(); - try { - int result = completableFuture.get(); - assertEquals(TIMEOUT_STATUS_CODE, result); - } catch (InterruptedException | ExecutionException e) { - //System.out.println("ERROR->"+e.getMessage()); - throw new RuntimeException(e); - } - } - } From e3ef6b62759b7651fac57ab072fdc5a92c7c614a Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Mon, 9 Oct 2023 20:40:45 +0700 Subject: [PATCH 047/831] [Update] non static --- .../CompletableFutureTimeoutUnitTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 449ebc5bbc..8070ef620a 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -5,6 +5,7 @@ import com.github.tomakehurst.wiremock.client.WireMock; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import java.io.IOException; import java.net.HttpURLConnection; @@ -15,14 +16,15 @@ import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) class CompletableFutureTimeoutUnitTest { - private static WireMockServer wireMockServer; - private static ScheduledExecutorService executorService; + private WireMockServer wireMockServer; + private ScheduledExecutorService executorService; private static final int DEFAULT_TIMEOUT = 1000; //1 seconds private static final int TIMEOUT_STATUS_CODE = 408; //0.5 seconds @BeforeAll - static void setUp() { + void setUp() { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); @@ -37,7 +39,7 @@ class CompletableFutureTimeoutUnitTest { @AfterAll - static void tearDown() { + void tearDown() { executorService.shutdown(); wireMockServer.stop(); } @@ -52,7 +54,7 @@ class CompletableFutureTimeoutUnitTest { } finally { connection.disconnect(); } - } catch (IOException e) { + } catch (Exception e) { return TIMEOUT_STATUS_CODE; } }); @@ -60,16 +62,15 @@ class CompletableFutureTimeoutUnitTest { @Test void whenorTimeout_thenGetThrow() { - CompletableFuture completableFuture = createDummyRequest() - .orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + CompletableFuture completableFuture = createDummyRequest(); + completableFuture.orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); assertThrows(ExecutionException.class, completableFuture::get); } @Test void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { - CompletableFuture completableFuture = createDummyRequest() - .completeOnTimeout(TIMEOUT_STATUS_CODE, DEFAULT_TIMEOUT, - TimeUnit.MILLISECONDS); + CompletableFuture completableFuture = createDummyRequest(); + completableFuture.completeOnTimeout(TIMEOUT_STATUS_CODE, DEFAULT_TIMEOUT,TimeUnit.MILLISECONDS); assertEquals(TIMEOUT_STATUS_CODE, completableFuture.get()); } From c8bc9634d5ca7f92fe65193ff6ddec6b8682ebfd Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Mon, 9 Oct 2023 21:00:52 +0530 Subject: [PATCH 048/831] JAVA-18764: Update article "CAS SSO with Spring Security" --- security-modules/cas/cas-secured-app/pom.xml | 9 ++++ .../cassecuredapp/CasSecuredApplication.java | 11 ++++- .../cassecuredapp/MyUserDetailsService.java | 34 +++++++++++++++ .../cassecuredapp/UserRepository.java | 15 +++++++ .../com/baeldung/cassecuredapp/Users.java | 41 +++++++++++++++++++ .../src/main/resources/application.properties | 8 +++- 6 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java create mode 100644 security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java create mode 100644 security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java diff --git a/security-modules/cas/cas-secured-app/pom.xml b/security-modules/cas/cas-secured-app/pom.xml index 6f1ec22cb5..6e1b878354 100644 --- a/security-modules/cas/cas-secured-app/pom.xml +++ b/security-modules/cas/cas-secured-app/pom.xml @@ -36,6 +36,15 @@ spring-boot-devtools runtime + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + runtime + org.springframework.boot spring-boot-starter-test diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java index 62da9cf725..9293a3e00f 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java @@ -6,6 +6,7 @@ import org.jasig.cas.client.validation.Cas30ServiceTicketValidator; import org.jasig.cas.client.validation.TicketValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @@ -34,6 +35,7 @@ public class CasSecuredApplication { SpringApplication.run(CasSecuredApplication.class, args); } + @Bean public CasAuthenticationFilter casAuthenticationFilter( AuthenticationManager authenticationManager, @@ -58,6 +60,10 @@ public class CasSecuredApplication { return new Cas30ServiceTicketValidator("https://localhost:8443/cas"); } + @Bean + public MyUserDetailsService getUser(){ + return new MyUserDetailsService(); + } @Bean public CasAuthenticationProvider casAuthenticationProvider( TicketValidator ticketValidator, @@ -65,9 +71,10 @@ public class CasSecuredApplication { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties); provider.setTicketValidator(ticketValidator); - provider.setUserDetailsService( + /* provider.setUserDetailsService( s -> new User("casuser", "Mellon", true, true, true, true, - AuthorityUtils.createAuthorityList("ROLE_ADMIN"))); + AuthorityUtils.createAuthorityList("ROLE_ADMIN")));*/ + provider.setUserDetailsService(getUser()); provider.setKey("CAS_PROVIDER_LOCALHOST_8900"); return provider; } diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java new file mode 100644 index 0000000000..35c83bfd75 --- /dev/null +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java @@ -0,0 +1,34 @@ +package com.baeldung.cassecuredapp; + +import java.util.Collections; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public class MyUserDetailsService implements UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // Get the user from the database. + Users users = getUserFromDatabase(username); + + // Create a UserDetails object. + UserDetails userDetails = new User( + users.getEmail(), + users.getPassword(), + Collections.singletonList(new SimpleGrantedAuthority("ROLE_ADMIN"))); + + return userDetails; + } + + private Users getUserFromDatabase(String username) { + return userRepository.findByEmail(username); + } +} diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java new file mode 100644 index 0000000000..366329a3fb --- /dev/null +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.cassecuredapp; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends CrudRepository { + + Users findByEmail(@Param("email") String email); + +} diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java new file mode 100644 index 0000000000..4e775e80e3 --- /dev/null +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java @@ -0,0 +1,41 @@ +package com.baeldung.cassecuredapp; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Users { + @Id + private Long id; + + @Column(nullable = false, unique = true) + private String email; + + private String password; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/security-modules/cas/cas-secured-app/src/main/resources/application.properties b/security-modules/cas/cas-secured-app/src/main/resources/application.properties index f8789997d5..fa13527982 100644 --- a/security-modules/cas/cas-secured-app/src/main/resources/application.properties +++ b/security-modules/cas/cas-secured-app/src/main/resources/application.properties @@ -1,2 +1,8 @@ server.port=8900 -spring.freemarker.suffix=.ftl \ No newline at end of file +spring.freemarker.suffix=.ftl + +spring.jpa.generate-ddl=false +spring.datasource.url= jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC +spring.datasource.username=root +spring.datasource.password=root1234 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file From 0e8c249abdd8e34d0f7d4c77bd9750431bfdaa8a Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:53:04 +0100 Subject: [PATCH 049/831] Update pom.xml --- spring-security-modules/spring-security-core/pom.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/spring-security-modules/spring-security-core/pom.xml b/spring-security-modules/spring-security-core/pom.xml index d8f2ce7dc9..03d7030057 100644 --- a/spring-security-modules/spring-security-core/pom.xml +++ b/spring-security-modules/spring-security-core/pom.xml @@ -49,16 +49,6 @@ org.springframework.security spring-security-test - - org.springframework.security - spring-security-web - 5.8.4 - - - org.springframework.security - spring-security-core - 5.8.4 - From 7fcd8a271b2a7a4beda65d0b0368a5eed6144298 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:53:46 +0100 Subject: [PATCH 050/831] Update pom.xml --- .../spring-security-core-2/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-core-2/pom.xml b/spring-security-modules/spring-security-core-2/pom.xml index e540d7bc01..55eaf262df 100644 --- a/spring-security-modules/spring-security-core-2/pom.xml +++ b/spring-security-modules/spring-security-core-2/pom.xml @@ -49,6 +49,16 @@ org.springframework.security spring-security-test + + org.springframework.security + spring-security-web + 5.8.4 + + + org.springframework.security + spring-security-core + 5.8.4 + @@ -100,4 +110,4 @@ - \ No newline at end of file + From ad0932acd1151d3b302f9671e293bc98ee330ee9 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:57:03 +0100 Subject: [PATCH 051/831] Rename HttpSecurityConfig.java to HttpSecurityConfig.java --- .../baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java (100%) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java From 4eb6c11b4034bbe798adb74d743198e5ea3b5592 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Mon, 9 Oct 2023 20:59:22 +0100 Subject: [PATCH 052/831] Rename WebSecurityConfig.java to WebSecurityConfig.java --- .../com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename spring-security-modules/{spring-security-core => spring-security-core-2}/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java (100%) diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java similarity index 100% rename from spring-security-modules/spring-security-core/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java rename to spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java From e85d088d17be113be8c4ee948b94e896122283c4 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 11 Oct 2023 00:03:46 +0530 Subject: [PATCH 053/831] BAEL-6910 Spring Boot 3.1's ConnectionDetails abstraction --- spring-boot-modules/spring-boot-3-1/pom.xml | 263 ++++++++++++++++++ .../ConnectionDetailsApplication.java | 15 + .../adapter/VaultAdapter.java | 124 +++++++++ .../CustomCassandraConnectionDetails.java | 32 +++ ...ssandraConnectionDetailsConfiguration.java | 17 ++ .../CustomCouchBaseConnectionDetails.java | 21 ++ ...uchBaseConnectionDetailsConfiguration.java | 16 ++ .../CustomElasticsearchConnectionDetails.java | 29 ++ ...csearchConnectionDetailsConfiguration.java | 17 ++ .../CustomKafkaConnectionDetails.java | 13 + ...omKafkaConnectionDetailsConfiguration.java | 15 + .../CustomNeo4jConnectionDetails.java | 24 ++ ...omNeo4jConnectionDetailsConfiguration.java | 17 ++ .../CustomZipkinConnectionDetails.java | 11 + ...mZipkinConnectionDetailsConfiguration.java | 17 ++ .../JdbcConnectionDetailsConfiguration.java | 17 ++ .../MongoDBConnectionDetails.java | 14 + ...MongoDBConnectionDetailsConfiguration.java | 17 ++ .../PostgresConnectionDetails.java | 21 ++ .../R2dbcPostgresConnectionDetails.java | 22 ++ ...ostgresConnectionDetailsConfiguration.java | 17 ++ .../RabbitMQConnectionDetails.java | 34 +++ ...abbitMQConnectionDetailsConfiguration.java | 17 ++ .../RedisCacheConnectionDetails.java | 26 ++ .../RedisConnectionDetailsConfiguration.java | 17 ++ .../controller/ZipkinDemoController.java | 19 ++ .../entity/elastic/Person.java | 27 ++ .../entity/neo4j/Person.java | 27 ++ .../application-cassandra.properties | 11 + .../application-couch.properties | 8 + .../application-elastic.properties | 7 + .../application-jdbc.properties | 7 + .../application-kafka.properties | 7 + .../application-mongo.properties | 8 + .../application-neo4j.properties | 7 + .../application-r2dbc.properties | 7 + .../application-rabbitmq.properties | 7 + .../application-redis.properties | 7 + .../application-zipkin.properties | 9 + .../docker/docker-compose-cassandra.yml | 9 + .../docker/docker-compose-couch.yml | 12 + .../docker/docker-compose-elastic.yml | 12 + .../docker/docker-compose-jdbc.yml | 10 + .../docker/docker-compose-kafka.yml | 38 +++ .../docker/docker-compose-mongo.yml | 10 + .../docker/docker-compose-neo4j.yml | 8 + .../docker/docker-compose-rabbitmq.yml | 9 + .../docker/docker-compose-redis.yml | 8 + .../docker/docker-compose-zipkin.yml | 10 + ...ssandra-connection-details-class-diag.puml | 27 ++ .../connection-details-sequence-design.puml | 16 ++ .../couch_connection_details_class_diag.puml | 25 ++ ...csearch-connection-details-class-diag.puml | 25 ++ .../jdbcconnection-details-class-diag.puml | 25 ++ .../kafka-connectiondetails-class-diag.puml | 21 ++ ...mongodb-connection-details-class-diag.puml | 19 ++ .../neo4j-connection-details-class-diag.puml | 23 ++ .../r2dbcconnection-details-class-diag.puml | 21 ++ ...abbitmq-connection-details-class-diag.puml | 27 ++ ...edis-connection-details-class-diagram.puml | 23 ++ .../zipkin-connection-details-class-diag.puml | 21 ++ ...andraConnectionDetailsIntegrationTest.java | 37 +++ ...hbaseConnectionDetailsIntegrationTest.java | 30 ++ ...earchConnectionDetailsIntegrationTest.java | 45 +++ .../JdbcConnectionDetailsIntegrationTest.java | 38 +++ ...KafkaConnectionDetailsIntegrationTest.java | 32 +++ ...ngoDBConnectionDetailsIntegrationTest.java | 47 ++++ ...Neo4jConnectionDetailsIntegrationTest.java | 43 +++ ...R2dbcConnectionDetailsIntegrationTest.java | 39 +++ ...bitmqConnectionDetailsIntegrationTest.java | 62 +++++ ...acheConnnectionDetailsIntegrationTest.java | 34 +++ 71 files changed, 1797 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-1/pom.xml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/pom.xml b/spring-boot-modules/spring-boot-3-1/pom.xml new file mode 100644 index 0000000000..597f384ed8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/pom.xml @@ -0,0 +1,263 @@ + + + 4.0.0 + spring-boot-3-1 + 0.0.1-SNAPSHOT + spring-boot-3-1 + Demo project for Spring Boot + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-hateoas + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-webflux + + + org.mock-server + mockserver-netty + ${mockserver.version} + + + + org.mock-server + mockserver-client-java + ${mockserver.version} + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + org.projectlombok + lombok + true + + + org.mapstruct + mapstruct + ${mapstruct.version} + true + + + org.springframework.boot + spring-boot-docker-compose + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-test + + + org.postgresql + postgresql + runtime + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.amqp + spring-rabbit-test + test + + + org.springframework.data + spring-data-redis + + + redis.clients + jedis + jar + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.postgresql + r2dbc-postgresql + runtime + + + org.springframework.boot + spring-boot-starter-data-r2dbc + + + io.projectreactor + reactor-test + test + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + org.springframework.boot + spring-boot-starter-data-cassandra + + + org.springframework.boot + spring-boot-starter-data-neo4j + + + org.springframework.kafka + spring-kafka + + + org.springframework.kafka + spring-kafka-test + test + + + org.springframework.boot + spring-boot-starter-data-couchbase + + + io.micrometer + micrometer-tracing-bridge-brave + + + io.zipkin.reporter2 + zipkin-reporter-brave + + + io.zipkin.reporter2 + zipkin-sender-urlconnection + + + + + + + docker-compose + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.dockercompose.DockerComposeApplication + + + + + + + connection-details + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.connectiondetails.ConnectionDetailsApplication + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + --enable-preview + + + + + + + 19 + 1.5.2.Final + 2.0.0 + 3.0.0-M7 + 5.14.0 + 0.2.0 + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java new file mode 100644 index 0000000000..d32ae8c4fb --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.connectiondetails; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +//@ComponentScan(basePackages = "com.baeldung.connectiondetails") +public class ConnectionDetailsApplication { + + public static void main(String[] args) { + SpringApplication.run(ConnectionDetailsApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java new file mode 100644 index 0000000000..e8319c7735 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java @@ -0,0 +1,124 @@ +package com.baeldung.connectiondetails.adapter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VaultAdapter { + private static final Logger logger = LoggerFactory.getLogger(VaultAdapter.class); + public static String getSecret(String secretKey) { + logger.info("call vault to get the secret of key: " + secretKey); + + //Postgres keys + if (secretKey.equalsIgnoreCase("postgres_secret_key")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("postgres_user_key")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("postgres_jdbc_url")) { + return "jdbc:postgresql://localhost:15432/postgresdb"; + } + //RabbitMQ Server Keys + if (secretKey.equalsIgnoreCase("rabbitmq_username")) { + return "rabbitmquser"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_password")) { + return "rabbitmq"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_port")) { + return "5672"; + } + if (secretKey.equalsIgnoreCase("rabbitmq_host")) { + return "localhost"; + } + //Redis Server Keys + if (secretKey.equalsIgnoreCase("redis_username")) { + return null; + } + if (secretKey.equalsIgnoreCase("redis_password")) { + return "redis"; + } + if (secretKey.equalsIgnoreCase("redis_port")) { + return "6379"; + } + if (secretKey.equalsIgnoreCase("redis_host")) { + return "localhost"; + } + //Mongo DB Keys + if (secretKey.equalsIgnoreCase("mongo_connection_string")) { + return "mongodb://localhost:27017/demodb"; + } + + //r2dbc Keys + if (secretKey.equalsIgnoreCase("r2dbc_postgres_user")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_secret")) { + return "postgres"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_port")) { + return "15432"; + } + if (secretKey.equalsIgnoreCase("r2dbc_postgres_database")) { + return "postgresdb"; + } + //Elastic Search Keys + if (secretKey.equalsIgnoreCase("elastic_user")) { + return "elastic"; + } + if (secretKey.equalsIgnoreCase("elastic_secret")) { + return "secret"; + } + if (secretKey.equalsIgnoreCase("elastic_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("elastic_port1")) { + return "19200"; + } + if (secretKey.equalsIgnoreCase("elastic_port2")) { + return "19300"; + } + //Cassandra keys + if (secretKey.equalsIgnoreCase("cassandra_user")) { + return "cassandra"; + } + if (secretKey.equalsIgnoreCase("cassandra_secret")) { + return "secret"; + } + if (secretKey.equalsIgnoreCase("cassandra_host")) { + return "localhost"; + } + if (secretKey.equalsIgnoreCase("cassandra_port")) { + return "19042"; + } + //Neo4j Keys + if (secretKey.equalsIgnoreCase("neo4j_secret")) { + return "neo4j123"; + } + if (secretKey.equalsIgnoreCase("neo4j_uri")) { + return "bolt://localhost:17687"; + } + //Kafka Keys + if (secretKey.equalsIgnoreCase("kafka_servers")) { + return "localhost:19092"; + } + //Couchbase Keys + if(secretKey.equalsIgnoreCase("couch_user")) { + return "Administrator"; + } + if(secretKey.equalsIgnoreCase("couch_secret")) { + return "password"; + } + if(secretKey.equalsIgnoreCase("couch_connection_string")) { + return "couchbase://127.0.0.1:8092"; + } + //Zipkin Keys + if(secretKey.equalsIgnoreCase("zipkin_span_endpoint")) { + return "http://localhost:9411/api/v2/spans"; + } + return "secretVal"; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java new file mode 100644 index 0000000000..6a246cd9fc --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java @@ -0,0 +1,32 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; + +import java.util.List; + +public class CustomCassandraConnectionDetails implements CassandraConnectionDetails { + @Override + public List getContactPoints() { + Node node = new Node( + VaultAdapter.getSecret("cassandra_host"), + Integer.parseInt(VaultAdapter.getSecret("cassandra_port")) + ); + return List.of(node); + } + + @Override + public String getUsername() { + return VaultAdapter.getSecret("cassandra_user"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("cassandra_secret"); + } + + @Override + public String getLocalDatacenter() { + return "datacenter-1"; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..02ed8c0051 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("cassandra") +public class CustomCassandraConnectionDetailsConfiguration { + @Bean + @Primary + public CassandraConnectionDetails getCustomCassandraConnectionDetails() { + return new CustomCassandraConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java new file mode 100644 index 0000000000..4fa0605cac --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java @@ -0,0 +1,21 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.couchbase.CouchbaseConnectionDetails; + +public class CustomCouchBaseConnectionDetails implements CouchbaseConnectionDetails { + @Override + public String getConnectionString() { + return VaultAdapter.getSecret("couch_connection_string"); + } + + @Override + public String getUsername() { + return VaultAdapter.getSecret("couch_user"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("couch_secret"); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..96cc34f92e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java @@ -0,0 +1,16 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.couchbase.CouchbaseConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("couch") + +public class CustomCouchBaseConnectionDetailsConfiguration { + @Bean + public CouchbaseConnectionDetails getCouchBaseConnectionDetails() { + return new CustomCouchBaseConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java new file mode 100644 index 0000000000..0b45878bc9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java @@ -0,0 +1,29 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; + +import java.util.List; + +public class CustomElasticsearchConnectionDetails implements ElasticsearchConnectionDetails { + @Override + public List getNodes() { + Node node1 = new Node( + VaultAdapter.getSecret("elastic_host"), + Integer.parseInt(VaultAdapter.getSecret("elastic_port1")), + Node.Protocol.HTTP + ); + return List.of(node1); + } + + @Override + public String getUsername() { + return VaultAdapter.getSecret("elastic_user"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("elastic_secret"); + } + +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..a9b3da44fa --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("elastic") +public class CustomElasticsearchConnectionDetailsConfiguration { + @Bean + @Primary + public ElasticsearchConnectionDetails getCustomElasticConnectionDetails() { + return new CustomElasticsearchConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java new file mode 100644 index 0000000000..6791ee6408 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java @@ -0,0 +1,13 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.kafka.KafkaConnectionDetails; + +import java.util.List; + +public class CustomKafkaConnectionDetails implements KafkaConnectionDetails { + @Override + public List getBootstrapServers() { + return List.of(VaultAdapter.getSecret("kafka_servers")); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..068281741a --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.kafka.KafkaConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("kafka") +public class CustomKafkaConnectionDetailsConfiguration { + @Bean + public KafkaConnectionDetails getKafkaConnectionDetails() { + return new CustomKafkaConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java new file mode 100644 index 0000000000..c0412fbb21 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java @@ -0,0 +1,24 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.neo4j.driver.AuthToken; +import org.neo4j.driver.AuthTokens; +import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; + +import java.net.URI; +import java.net.URISyntaxException; + +public class CustomNeo4jConnectionDetails implements Neo4jConnectionDetails { + @Override + public URI getUri() { + try { + return new URI(VaultAdapter.getSecret("neo4j_uri")); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + @Override + public AuthToken getAuthToken() { + return AuthTokens.basic("neo4j", VaultAdapter.getSecret("neo4j_secret")); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..aec8908c7d --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("neo4j") +public class CustomNeo4jConnectionDetailsConfiguration { + @Bean + @Primary + public Neo4jConnectionDetails getNeo4jConnectionDetails() { + return new CustomNeo4jConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java new file mode 100644 index 0000000000..c29408992a --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java @@ -0,0 +1,11 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConnectionDetails; + +public class CustomZipkinConnectionDetails implements ZipkinConnectionDetails { + @Override + public String getSpanEndpoint() { + return VaultAdapter.getSecret("zipkin_span_endpoint"); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..2f451a3850 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("zipkin") +public class CustomZipkinConnectionDetailsConfiguration { + @Bean + @Primary + public ZipkinConnectionDetails getZipkinConnectionDetails() { + return new CustomZipkinConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..3387356366 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("jdbc") +public class JdbcConnectionDetailsConfiguration { + @Bean + @Primary + public JdbcConnectionDetails getPostgresConnection() { + return new PostgresConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java new file mode 100644 index 0000000000..df689d81b6 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java @@ -0,0 +1,14 @@ +package com.baeldung.connectiondetails.configuration; + + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import com.mongodb.ConnectionString; +import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; + +public class MongoDBConnectionDetails implements MongoConnectionDetails { + @Override + public ConnectionString getConnectionString() { + return new ConnectionString(VaultAdapter.getSecret("mongo_connection_string")); + } +} + diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..d455991d08 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("mongo") +public class MongoDBConnectionDetailsConfiguration { + @Bean + @Primary + public MongoConnectionDetails getMongoConnectionDetails() { + return new MongoDBConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java new file mode 100644 index 0000000000..c9b213a8d3 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java @@ -0,0 +1,21 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; + +public class PostgresConnectionDetails implements JdbcConnectionDetails { + @Override + public String getUsername() { + return VaultAdapter.getSecret("postgres_user_key"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("postgres_secret_key"); + } + + @Override + public String getJdbcUrl() { + return VaultAdapter.getSecret("postgres_jdbc_url"); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java new file mode 100644 index 0000000000..4ce6abc9d5 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java @@ -0,0 +1,22 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; + +public class R2dbcPostgresConnectionDetails implements R2dbcConnectionDetails { + @Override + public ConnectionFactoryOptions getConnectionFactoryOptions() { + + ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() + .option(ConnectionFactoryOptions.DRIVER, "postgresql") + .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host")) + .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port"))) + .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user")) + .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret")) + .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database")) + .build(); + + return options; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..144355dce4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("r2dbc") +public class R2dbcPostgresConnectionDetailsConfiguration { + @Bean + @Primary + public R2dbcConnectionDetails getR2dbcPostgresConnectionDetails() { + return new R2dbcPostgresConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java new file mode 100644 index 0000000000..9dc4bdf33b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java @@ -0,0 +1,34 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; + +import java.util.List; + +public class RabbitMQConnectionDetails implements RabbitConnectionDetails { + @Override + public String getUsername() { + return VaultAdapter.getSecret("rabbitmq_username"); + } + + @Override + public String getPassword() { + return VaultAdapter.getSecret("rabbitmq_password"); + } + + @Override + public String getVirtualHost() { + return "/"; + } + + @Override + public List
getAddresses() { + return List.of(this.getFirstAddress()); + } + + @Override + public Address getFirstAddress() { + return new Address(VaultAdapter.getSecret("rabbitmq_host"), + Integer.parseInt(VaultAdapter.getSecret("rabbitmq_port"))); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..237bec3fc4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("rabbitmq") +public class RabbitMQConnectionDetailsConfiguration { + @Primary + @Bean + public RabbitConnectionDetails getRabbitmqConnection() { + return new RabbitMQConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java new file mode 100644 index 0000000000..9485f22240 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java @@ -0,0 +1,26 @@ +package com.baeldung.connectiondetails.configuration; + +import com.baeldung.connectiondetails.adapter.VaultAdapter; +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; + +public class RedisCacheConnectionDetails implements RedisConnectionDetails { + @Override + public String getPassword() { + return VaultAdapter.getSecret("redis_password"); + } + + @Override + public Standalone getStandalone() { + return new Standalone() { + @Override + public String getHost() { + return VaultAdapter.getSecret("redis_host"); + } + + @Override + public int getPort() { + return Integer.parseInt(VaultAdapter.getSecret("redis_port")); + } + }; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java new file mode 100644 index 0000000000..31816ff0b4 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.connectiondetails.configuration; + +import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; + +@Configuration(proxyBeanMethods = false) +@Profile("redis") +public class RedisConnectionDetailsConfiguration { + @Bean + @Primary + public RedisConnectionDetails getRedisCacheConnection() { + return new RedisCacheConnectionDetails(); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java new file mode 100644 index 0000000000..bba5607ccd --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java @@ -0,0 +1,19 @@ +package com.baeldung.connectiondetails.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ZipkinDemoController { + + Logger logger = LoggerFactory.getLogger(ZipkinDemoController.class); + + @GetMapping("/zipkin/test") + public @ResponseBody String testMethod() { + logger.info("This is a test"); + return "This is a test"; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java new file mode 100644 index 0000000000..851dbb7c90 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.connectiondetails.entity.elastic; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +@Document(indexName = "person") +public class Person { + String name; + @Id + String ssn; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSsn() { + return ssn; + } + + public void setSsn(String ssn) { + this.ssn = ssn; + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java new file mode 100644 index 0000000000..63e88d0a41 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.connectiondetails.entity.neo4j; + +import org.springframework.data.neo4j.core.schema.Id; +import org.springframework.data.neo4j.core.schema.Node; + +@Node +public class Person { + @Id + String name; + String zipcode; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getZipcode() { + return zipcode; + } + + public void setZipcode(String zipcode) { + this.zipcode = zipcode; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties new file mode 100644 index 0000000000..4098206d21 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties @@ -0,0 +1,11 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-cassandra.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=cassandra +spring.cassandra.local-datacenter=dc1 +#spring.cassandra.keyspace-name=spring_cassandra +#spring.cassandra.schema-action=CREATE_IF_NOT_EXISTS +spring.data.cassandra.request.timeout=20000 # Set your desired timeout in milliseconds +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties new file mode 100644 index 0000000000..ccce04c0b5 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties @@ -0,0 +1,8 @@ +spring.profiles.active=couch +spring.docker.compose.enabled=false +spring.docker.compose.file=./connectiondetails/docker/docker-compose-couch.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.couchbase.bucket.name=travel-sample +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties new file mode 100644 index 0000000000..2149730517 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-elastic.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=elastic +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties new file mode 100644 index 0000000000..b5a8a73bcf --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-jdbc.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=jdbc +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties new file mode 100644 index 0000000000..9f756cfaf1 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-kafka.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=kafka +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties new file mode 100644 index 0000000000..31d828c5c9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties @@ -0,0 +1,8 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-mongo.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=mongo +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration +spring.data.mongodb.database=demodb \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties new file mode 100644 index 0000000000..e2dc9e20bf --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-neo4j.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=neo4j +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties new file mode 100644 index 0000000000..3fcaa4f746 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-jdbc.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=r2dbc +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties new file mode 100644 index 0000000000..fa6b3f6608 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-rabbitmq.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=rabbitmq +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties new file mode 100644 index 0000000000..c12f20c773 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties @@ -0,0 +1,7 @@ +spring.docker.compose.enabled=true +spring.docker.compose.file=./connectiondetails/docker/docker-compose-redis.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.profiles.active=redis +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration, org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties new file mode 100644 index 0000000000..544a3c07b6 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties @@ -0,0 +1,9 @@ +spring.profiles.active=zipkin +spring.docker.compose.enabled=false +spring.docker.compose.file=./connectiondetails/docker/docker-compose-zipkin.yml +spring.docker.compose.skip.in-tests=false +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.mustache.check-template-location=false +spring.application.name=baeldung +management.tracing.sampling.probability=1.0 +spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jReactiveRepositoriesAutoConfiguration diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml new file mode 100644 index 0000000000..c593cbc73b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml @@ -0,0 +1,9 @@ +version: '3.8' +services: + cassandra: + image: 'cassandra:latest' + environment: + - 'CASSANDRA_DC=datacenter-1' + - 'CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch' + ports: + - '19042:9042' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml new file mode 100644 index 0000000000..edcf8e2e08 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml @@ -0,0 +1,12 @@ +version: '3.8' +services: + couchbase: + image: couchbase/server-sandbox:7.0.0 + ports: + - "8091-8095:8091-8095" + - "9102:9102" + - "11210:11210" + expose: + - "8091" + - "8094" + container_name: couchbase-sandbox-7.0.0-mm \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml new file mode 100644 index 0000000000..a6e51ee1a0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml @@ -0,0 +1,12 @@ +version: '3.8' +services: + elasticsearch: + image: 'docker.elastic.co/elasticsearch/elasticsearch:7.17.10' + environment: + - 'ELASTIC_USERNAME=elastic' + - 'ELASTIC_PASSWORD=secret' + - 'discovery.type=single-node' + - 'xpack.security.enabled=false' + ports: + - '19200:9200' +# - '19300:9300' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml new file mode 100644 index 0000000000..65a8f135e8 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml @@ -0,0 +1,10 @@ +version: '3.8' +services: + database: + image: 'postgres:13.1-alpine' + ports: + - '15432:5432' + environment: + - 'POSTGRES_USER=postgres' + - 'POSTGRES_DB=postgresdb' + - 'POSTGRES_PASSWORD=postgres' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml new file mode 100644 index 0000000000..5d13e6d6cc --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml @@ -0,0 +1,38 @@ +version: '3' +services: + zookeeper: + image: confluentinc/cp-zookeeper:latest + container_name: zookeeper + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + ports: + - "2181:2181" + + schema-registry: + image: confluentinc/cp-schema-registry:latest + hostname: schema-registry + depends_on: + - kafka-broker-1 + ports: + - "8081:8081" + environment: + SCHEMA_REGISTRY_HOST_NAME: schema-registry + SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181' + SCHEMA_REGISTRY_LISTENERS: http://schema-registry:8081 + SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: PLAINTEXT://kafka-broker-1:9092,PLAINTEXT_INTERNAL://localhost:19092 + SCHEMA_REGISTRY_DEBUG: 'true' + + kafka-broker-1: + image: confluentinc/cp-kafka:latest + hostname: kafka-broker-1 + ports: + - "19092:19092" + depends_on: + - zookeeper + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-1:9092,PLAINTEXT_INTERNAL://localhost:19092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml new file mode 100644 index 0000000000..f12f5c3aa7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml @@ -0,0 +1,10 @@ +version: '3.8' +services: + mongodb: + image: 'mongo:latest' + environment: + - 'MONGO_INITDB_DATABASE=demodb' +# - 'MONGO_INITDB_ROOT_PASSWORD=Mongo123' +# - 'MONGO_INITDB_ROOT_USERNAME=mongouser' + ports: + - '27017:27017' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml new file mode 100644 index 0000000000..611951e755 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml @@ -0,0 +1,8 @@ +version: '3.8' +services: + neo4j: + image: 'neo4j:latest' + ports: + - '17687:7687' + environment: + NEO4J_AUTH: neo4j/neo4j123 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml new file mode 100644 index 0000000000..8abf19bd19 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml @@ -0,0 +1,9 @@ +version: '3.8' +services: + rabbitmq: + image: 'rabbitmq:latest' + environment: + - 'RABBITMQ_DEFAULT_PASS=rabbitmq' + - 'RABBITMQ_DEFAULT_USER=rabbitmquser' + ports: + - '5672:5672' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml new file mode 100644 index 0000000000..c218cef998 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml @@ -0,0 +1,8 @@ +version: '3.8' +services: + redis: + image: 'redis:latest' + ports: + - '6379:6379' + environment: + - 'REDIS_REQUIREPASS=redis' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml new file mode 100644 index 0000000000..363dd24a2b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml @@ -0,0 +1,10 @@ +version: '3' +services: + zipkin: + image: 'openzipkin/zipkin:latest' + ports: + - "9411:9411" +# environment: +# - ZIPKIN_AUTH_USERNAME=your-username +# - ZIPKIN_AUTH_PASSWORD=your-password + # Add other necessary configurations here diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml new file mode 100644 index 0000000000..b16ef4d56e --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml @@ -0,0 +1,27 @@ +@startuml +'https://plantuml.com/class-diagram + +interface CassandraConnectionDetails { + +getUsername():String + +getPassword():String + +getContactPoints():List + +getLocalDatacenter():String +} +class CustomCouchBaseConnectionDetails { + +getUsername():String + +getPassword():String + +getContactPoints():List + +getLocalDatacenter():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomCassandraConnectionDetailsConfiguration { + +getCustomCassandraConnectionDetails():CassandraConnectionDetails +} +CustomCouchBaseConnectionDetails -left-> VaultAdapter:uses +CustomCouchBaseConnectionDetails -right-|> CassandraConnectionDetails : implements +CustomCassandraConnectionDetailsConfiguration -up-> CustomCassandraConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml new file mode 100644 index 0000000000..a2a917eea0 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml @@ -0,0 +1,16 @@ +@startuml +'https://plantuml.com/sequence-diagram +skinparam sequenceMessageAlign direction +skinparam handwritten true +skinparam sequence { +ParticipantBackgroundColor beige +ParticipantPadding 50 +} +autonumber + +"Spring Boot" -[#63b175]> "Hashicorp Vault": Secret Request +"Hashicorp Vault" -[#63b175]-> "Spring Boot": Secret Response +"Spring Boot" -[#63b175]> "Remote Service": Connection Request + +"Remote Service" -[#63b175]-> "Spring Boot": Connection Response +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml new file mode 100644 index 0000000000..fd8dbd094b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +interface CouchbaseConnectionDetails { + +getUsername():String + +getPassword():String + +getConnectionString():String +} +class CustomCouchBaseConnectionDetails { + +getUsername():String + +getPassword():String + +getConnectionString():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomCouchBaseConnectionDetailsConfiguration { + +getCouchBaseConnectionDetails():CouchbaseConnectionDetails +} +CustomCouchBaseConnectionDetails -left-> VaultAdapter:uses +CustomCouchBaseConnectionDetails -right-|> CouchbaseConnectionDetails : implements +CustomCouchBaseConnectionDetailsConfiguration -up-> CustomCouchBaseConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml new file mode 100644 index 0000000000..48db0bcc4f --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +interface ElasticsearchConnectionDetails { + +getUsername():String + +getPassword():String + +getNodes():List +} +class CustomElasticsearchConnectionDetails { + +getUsername():String + +getPassword():String + +getNodes():List +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomElasticsearchConnectionDetailsConfiguration { + +getCustomElasticConnectionDetails():ElasticsearchConnectionDetails +} +CustomElasticsearchConnectionDetails -left-> VaultAdapter:uses +CustomElasticsearchConnectionDetails -right-|> ElasticsearchConnectionDetails : implements +CustomElasticsearchConnectionDetailsConfiguration -up-> CustomElasticsearchConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml new file mode 100644 index 0000000000..88de5d607f --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +interface JdbcConnectionDetails { + +getUsername():String + +getPassword():String + +getJdbcUrl():String +} +class PostgresConnectionDetails { + +getUsername():String + +getPassword():String + +getJdbcUrl():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class JdbcConnectonDetailsConfiguration { + +getPostgresConnection():JdbcConnectionDetails +} +PostgresConnectionDetails -left-> VaultAdapter:uses +PostgresConnectionDetails -right-|> JdbcConnectionDetails : implements +JdbcConnectonDetailsConfiguration -up-> PostgresConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml new file mode 100644 index 0000000000..57df331bb2 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/class-diagram + +interface KafkaConnectionDetails { + +getBootstrapServers():List +} +class CustomKafkaConnectionDetails { ++getBootstrapServers():List +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomKafkaConnectionDetailsConfiguration { + +getKafkaConnectionDetails():KafkaConnectionDetails +} +CustomKafkaConnectionDetails -left-> VaultAdapter:uses +CustomKafkaConnectionDetails -right-|> KafkaConnectionDetails:implements +CustomKafkaConnectionDetailsConfiguration -up-> CustomKafkaConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml new file mode 100644 index 0000000000..974c6de601 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml @@ -0,0 +1,19 @@ +@startuml +'https://plantuml.com/class-diagram + +interface MongoConnectionDetails { + getConnectionString():ConnectionString +} +class MongoDBConnectionDetails { + getConnectionString():ConnectionString +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class MongoDBConnectionDetailsConfiguration { + +getMongoConnectionDetails() : MongoConnectionDetails +} +MongoDBConnectionDetails -left-> VaultAdapter:uses +MongoDBConnectionDetails -right-|> MongoConnectionDetails : implements +MongoDBConnectionDetailsConfiguration -up-> MongoDBConnectionDetails:uses +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml new file mode 100644 index 0000000000..5a3e8812f6 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml @@ -0,0 +1,23 @@ +@startuml +'https://plantuml.com/class-diagram + +interface Neo4jConnectionDetails { + +getUri():URI + +getAuthToken():AuthToken +} +class CustomNeo4jConnectionDetails { + +getUri():URI + +getAuthToken():AuthToken +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomNeo4jConnectionDetailsConfiguration { + +getNeo4jConnectionDetails():Neo4jConnectionDetails +} +CustomNeo4jConnectionDetails -left-> VaultAdapter:uses +CustomNeo4jConnectionDetails -right-|> Neo4jConnectionDetails:implements +CustomNeo4jConnectionDetailsConfiguration -up-> CustomNeo4jConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml new file mode 100644 index 0000000000..ec69587ab9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/class-diagram + +interface R2dbcConnectionDetails { + +getConnectionFactoryOptions():ConnectionFactoryOptions +} +class R2dbcPostgresConnectionDetails { + +getConnectionFactoryOptions():ConnectionFactoryOptions +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class R2dbcPostgresConnectionDetailsConfiguration { + +getR2dbcPostgresConnectionDetails():R2dbcConnectionDetails +} +R2dbcPostgresConnectionDetails -right-> VaultAdapter:uses +R2dbcPostgresConnectionDetails -up-|> R2dbcConnectionDetails:implements +R2dbcPostgresConnectionDetailsConfiguration -up-> R2dbcPostgresConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml new file mode 100644 index 0000000000..0541e12915 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml @@ -0,0 +1,27 @@ +@startuml +'https://plantuml.com/class-diagram + +interface RabbitConnectionDetails { + +getUsername():String + +getPassword():String + +getFirstAddress():Address + +getAddresses():List
+} +class RabbitMQConnectionDetails { + +getUsername():String + +getPassword():String + +getFirstAddress():Address + +getAddresses():List
+} +class VaultAdapter { + +getSecret(String secretKey):String +} +class RabbitMQConnectionDetailsConfiguration { + +getRabbitmqConnection() : RabbitConnectionDetails +} +RabbitMQConnectionDetails -left-> VaultAdapter:uses +RabbitMQConnectionDetails -right-|> RabbitConnectionDetails : implements +RabbitMQConnectionDetailsConfiguration -up-> RabbitMQConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml new file mode 100644 index 0000000000..a18c83a8be --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml @@ -0,0 +1,23 @@ +@startuml +'https://plantuml.com/class-diagram + +interface RedisConnectionDetails { + +getPassword():String + +getStandalone():Standalone +} +class RedisCacheConnectionDetails { + +getPassword():String + +getStandalone():Standalone +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class RedisConnectonDetailsConfiguration { + +getRedisCacheConnection():RedisConnectionDetails +} +RedisCacheConnectionDetails -left-> VaultAdapter:uses +RedisCacheConnectionDetails -right-|> RedisConnectionDetails : implements +RedisConnectonDetailsConfiguration -up-> RedisCacheConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml new file mode 100644 index 0000000000..0f185f9c12 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/class-diagram + +interface ZipkinConnectionDetails { + +getSpanEndpoint():String +} +class CustomZipkinConnectionDetails { + +getSpanEndpoint():String +} +class VaultAdapter { + +getSecret(String secretKey):String +} +class CustomZipkinConnectionDetailsConfiguration { + +getZipkinConnectionDetails():ZipkinConnectionDetails +} +CustomZipkinConnectionDetails -left-> VaultAdapter:uses +CustomZipkinConnectionDetails -right-|> ZipkinConnectionDetails:implements +CustomZipkinConnectionDetailsConfiguration -up-> CustomZipkinConnectionDetails:uses + + +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..4130b6cb6b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.cassandra.core.CassandraTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomCassandraConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"}) +@ActiveProfiles("cassandra") +public class CassandraConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class); + @Autowired + private CassandraTemplate cassandraTemplate; + @Test + public void givenHashicorpVault_whenRunQuery_thenSuccess() { + boolean result = cassandraTemplate.getCqlOperations() + .execute("CREATE KEYSPACE IF NOT EXISTS spring_cassandra" + + " WITH replication = {'class':'SimpleStrategy', 'replication_factor':3}"); + logger.info("the result -" + result); + assertTrue(result); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..454aad4c6c --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomCouchBaseConnectionDetailsConfiguration; +import com.couchbase.client.java.Cluster; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomCouchBaseConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-couch.properties"}) +@ActiveProfiles("couch") +public class CouchbaseConnectionDetailsIntegrationTest { + @Autowired + private Cluster cluster; + @Test + public void givenSecretVault_whenConnectWithCouch_thenSuccess() { + assertDoesNotThrow(cluster.ping()::version); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..ee698cd6ea --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java @@ -0,0 +1,45 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration; +import com.baeldung.connectiondetails.entity.elastic.Person; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomElasticsearchConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"}) +@ActiveProfiles("elastic") +public class ElasticsearchConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class); + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + @Before + public void prepare() { + if (elasticsearchTemplate.indexOps(Person.class).exists()) { + elasticsearchTemplate.indexOps(Person.class).delete(); + } + } + @Test + public void givenHashicorpVault_whenCreateIndexInElastic_thenSuccess() { + + boolean result = elasticsearchTemplate.indexOps(Person.class).create(); + logger.info("index created:" + result); + assertTrue(result); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..748bc27b0b --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.sql.Date; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(JdbcConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"}) +@ActiveProfiles("jdbc") +public class JdbcConnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class); + @Autowired + private JdbcTemplate jdbcTemplate; + @Test + public void givenSecretVault_whenIntegrateWithPostgres_thenConnectionSuccessful() { + String sql = "select current_date;"; + Date date = jdbcTemplate.queryForObject(sql, Date.class); + assertEquals(LocalDate.now().toString(), date.toString()); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..bc0e174b3f --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomKafkaConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomKafkaConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-kafka.properties"}) +@ActiveProfiles("kafka") +public class KafkaConnectionDetailsIntegrationTest { + @Autowired + private KafkaTemplate kafkaTemplate; + + @Test + public void givenSecretVault_whenPublishMsgToKafkaQueue_thenSuccess() { + assertDoesNotThrow(kafkaTemplate::getDefaultTopic); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..868ebfea98 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration; +import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration; +import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(MongoDBConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"}) +@ActiveProfiles("mongo") +public class MongoDBConnectionDetailsIntegrationTest { + + @Autowired + private MongoTemplate mongoTemplate; + @Test + public void givenSecretVault_whenExecuteQueryOnMongoDB_ReturnResult() throws JSONException { + mongoTemplate.insert("{\"msg\":\"My First Entry in MongoDB\"}", "myDemoCollection"); + String result = mongoTemplate.find(new Query(), String.class, "myDemoCollection").get(0); + + JSONObject jsonObject = new JSONObject(result); + result = jsonObject.get("msg").toString(); + R2dbcAutoConfiguration r2dbcAutoConfiguration; + R2dbcDataAutoConfiguration r2dbcDataAutoConfiguration; + R2dbcRepositoriesAutoConfiguration r2dbcRepositoriesAutoConfiguration; + + assertEquals("My First Entry in MongoDB", result); + } +} + diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..943ed7bdea --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java @@ -0,0 +1,43 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration; +import com.baeldung.connectiondetails.entity.neo4j.Person; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.neo4j.core.Neo4jTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(CustomNeo4jConnectionDetailsConfiguration.class) +@ComponentScan(basePackages = "com.baeldung.connectiondetails") +@TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"}) +@ActiveProfiles("neo4j") +public class Neo4jConnectionDetailsIntegrationTest { + @Autowired + private Neo4jTemplate neo4jTemplate; + + @After + public void cleanup() { + neo4jTemplate.deleteAll(Person.class); + } + @Test + public void giveSecretVault_whenRunQuery_thenSuccess() { + Person person = new Person(); + person.setName("James"); + person.setZipcode("751003"); + + Person data = neo4jTemplate.save(person); + assertEquals("James", data.getName()); + } + +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..5f8c8349fb --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(R2dbcPostgresConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"}) +@ActiveProfiles("r2dbc") +public class R2dbcConnectionDetailsIntegrationTest { + Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class); + @Autowired + private R2dbcEntityTemplate r2dbcEntityTemplate; + + @Test + public void givenSecretVault_whenQueryPostgresReactive_thenSuccess() { + + String sql = "select * from information_schema.tables"; + + List result = r2dbcEntityTemplate.getDatabaseClient().sql(sql).fetch().all() + .map(r -> { + return "hello " + r.get("table_name").toString(); + }).collectList().block(); + logger.info("count ------" + result.size()); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..9e10973ed7 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java @@ -0,0 +1,62 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(RabbitMQConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"}) +@ActiveProfiles("rabbitmq") +public class RabbitmqConnectionDetailsIntegrationTest { + + private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class); + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Autowired + private CachingConnectionFactory connectionFactory; + + private final static String queueName = "Test_Queue"; + + RabbitAdmin rabbitAdmin; + + @Before + public void setup() { + logger.info("create new queue"); + rabbitAdmin = new RabbitAdmin(connectionFactory); + logger.info("creating queue: " + rabbitAdmin.declareQueue(new Queue(queueName))); + connectionFactory.destroy(); + } + + @After + public void cleanup() { + logger.info("delete queue"); + this.rabbitAdmin.deleteQueue(queueName, false, true); + } + @Test + public void givenSecretVault_whenPublishMessageToRabbitmq_thenSuccess() { + logger.info("sending message to queue " + queueName); + final String MSG = "this is a test message"; + this.rabbitTemplate.convertAndSend(queueName, MSG); + assertEquals(MSG, this.rabbitTemplate.receiveAndConvert(queueName)); + } +} diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java new file mode 100644 index 0000000000..5dbd2d6c03 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.connectiondetails; + +import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConnectionDetailsApplication.class) +@Import(RedisConnectionDetailsConfiguration.class) +@TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"}) +@ActiveProfiles("redis") +public class RedisCacheConnnectionDetailsIntegrationTest { + private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class); + + @Autowired + RedisTemplate redisTemplate; + + @Test + public void giveSecretVault_whenStoreInRedisCache_thenSuccess() { + redisTemplate.opsForValue().set("City", "New York"); + assertEquals("New York", redisTemplate.opsForValue().get("City")); + } +} From b9439eab8d9c6cc6f0322bf618f6db2da20bbc1b Mon Sep 17 00:00:00 2001 From: gaepi Date: Tue, 10 Oct 2023 20:37:32 +0200 Subject: [PATCH 054/831] JAVA-26071 | log.info instead of system.out.println() + removed unused file appender --- .../main/java/com/baeldung/bridge/BridgePatternDriver.java | 6 ++++-- .../java/com/baeldung/composite/FinancialDepartment.java | 4 +++- .../main/java/com/baeldung/composite/SalesDepartment.java | 4 +++- .../src/main/resources/log4jstructuraldp.properties | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java index 31d18a2347..78e20a15be 100644 --- a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java @@ -1,14 +1,16 @@ package com.baeldung.bridge; +import static com.baeldung.util.LoggerUtil.LOG; + public class BridgePatternDriver { public static void main(String[] args) { //a square with red color Shape square = new Square(new Red()); - System.out.println(square.draw()); + LOG.info(square.draw()); //a triangle with blue color Shape triangle = new Triangle(new Blue()); - System.out.println(triangle.draw()); + LOG.info(triangle.draw()); } } diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java index 173281f833..b8ec67afab 100644 --- a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java @@ -1,5 +1,7 @@ package com.baeldung.composite; +import static com.baeldung.util.LoggerUtil.LOG; + /** * Created by Gebruiker on 5/1/2018. */ @@ -14,7 +16,7 @@ public class FinancialDepartment implements Department { } public void printDepartmentName() { - System.out.println(getClass().getSimpleName()); + LOG.info(getClass().getSimpleName()); } public Integer getId() { diff --git a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java index 7f5e903100..fdc3076b53 100644 --- a/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java +++ b/patterns-modules/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java @@ -1,5 +1,7 @@ package com.baeldung.composite; +import static com.baeldung.util.LoggerUtil.LOG; + /** * Created by Gebruiker on 5/1/2018. */ @@ -14,7 +16,7 @@ public class SalesDepartment implements Department { } public void printDepartmentName() { - System.out.println(getClass().getSimpleName()); + LOG.info(getClass().getSimpleName()); } public Integer getId() { diff --git a/patterns-modules/design-patterns-structural/src/main/resources/log4jstructuraldp.properties b/patterns-modules/design-patterns-structural/src/main/resources/log4jstructuraldp.properties index 5bc2bfe4b9..d7bfb41d12 100644 --- a/patterns-modules/design-patterns-structural/src/main/resources/log4jstructuraldp.properties +++ b/patterns-modules/design-patterns-structural/src/main/resources/log4jstructuraldp.properties @@ -1,6 +1,6 @@ # Root logger -log4j.rootLogger=INFO, file, stdout +log4j.rootLogger=INFO, stdout # Write to console log4j.appender.stdout=org.apache.log4j.ConsoleAppender From 307d0f5e409b29c6bced2310206ba093b34769e7 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Tue, 10 Oct 2023 22:39:14 -0400 Subject: [PATCH 055/831] Message Ordering - First Draft. --- apache-kafka-2/pom.xml | 5 ++ .../ordering/ConsumerConfigurations.java | 32 ++++++++++++ .../ExtSeqWithTimeWindowConsumer.java | 49 +++++++++++++++++++ .../ExtSeqWithTimeWindowProducer.java | 29 +++++++++++ .../ordering/MultiPartitionConsumer.java | 34 +++++++++++++ .../ordering/MultiPartitionProducer.java | 27 ++++++++++ .../ordering/ProducerConfigurations.java | 27 ++++++++++ .../ordering/SinglePartitionConsumer.java | 35 +++++++++++++ .../ordering/SinglePartitionProducer.java | 29 +++++++++++ .../message/ordering/payload/Message.java | 36 ++++++++++++++ .../serialization/JacksonDeserializer.java | 36 ++++++++++++++ .../serialization/JacksonSerializer.java | 20 ++++++++ 12 files changed, 359 insertions(+) create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index 067dedef8a..45b31004b7 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -57,6 +57,11 @@ ${lombok.version} provided + + com.fasterxml.jackson.core + jackson-databind + 2.15.2 + diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java new file mode 100644 index 0000000000..b18db3ef24 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -0,0 +1,32 @@ +package com.baeldung.kafka.message.ordering; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; + +import java.time.Duration; +import java.util.Collections; +import java.util.Properties; + +public class ConsumerConfigurations { + public static void main(String[] args) { + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put("max.poll.records", "500"); + props.put("fetch.min.bytes", "1"); + props.put("fetch.max.wait.ms", "500"); + Consumer consumer = new KafkaConsumer<>(props); + consumer.subscribe(Collections.singletonList("multi_partition_topic")); + + while (true) { + ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); + records.forEach(record -> { + System.out.println("Partition: " + record.partition() + ", Message: " + record.value()); + }); + } + } +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java new file mode 100644 index 0000000000..5b01a86e39 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -0,0 +1,49 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; + +import java.time.Duration; +import java.util.*; + +public class ExtSeqWithTimeWindowConsumer { + private static final long BUFFER_PERIOD_MS = 5000; + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); + + public static void main(String[] args) { + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + props.put("value.deserializer.serializedClass", Message.class); + Consumer consumer = new KafkaConsumer<>(props); + consumer.subscribe(Collections.singletonList("multi_partition_topic")); + List buffer = new ArrayList<>(); + long lastProcessedTime = System.nanoTime(); + while (true) { + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + if (record != null && record.value() != null) { + buffer.add(record.value()); + } + }); + if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_MS) { + processBuffer(buffer); + lastProcessedTime = System.nanoTime(); + } + } + } + + private static void processBuffer(List buffer) { + Collections.sort(buffer); + buffer.forEach(message -> { + System.out.println("Processing message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + }); + buffer.clear(); + } +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java new file mode 100644 index 0000000000..91c5af716f --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -0,0 +1,29 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; + +import java.util.Properties; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; + +public class ExtSeqWithTimeWindowProducer { + public static void main(String[] args) { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + + KafkaProducer producer = new KafkaProducer<>(props); + for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { + long messageId = Message.getRandomMessageId(); + String key = "Key-" + insertPosition; + Message message = new Message(insertPosition, messageId); + producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); + System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + } + producer.close(); + System.out.println("ExternalSequencingProducer Completed."); + } +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java new file mode 100644 index 0000000000..f9b0b3b040 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -0,0 +1,34 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; + +import java.time.Duration; +import java.util.Collections; +import java.util.Properties; + +public class MultiPartitionConsumer { + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); + public static void main(String[] args) { + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + props.put("value.deserializer.serializedClass", Message.class); + Consumer consumer = new KafkaConsumer<>(props); + consumer.subscribe(Collections.singletonList("multi_partition_topic")); + while (true) { + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + Message message = record.value(); + System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + }); + } + } +} + diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java new file mode 100644 index 0000000000..8b2a49b2b5 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -0,0 +1,27 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; + +import java.util.Properties; + +public class MultiPartitionProducer { + public static void main(String[] args) { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + + KafkaProducer producer = new KafkaProducer<>(props); + for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { + long messageId = Message.getRandomMessageId(); + String key = "Key-" + insertPosition; + Message message = new Message(insertPosition, messageId); + producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); + System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + } + producer.close(); + System.out.println("SinglePartitionProducer Completed."); + } +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java new file mode 100644 index 0000000000..bcdf6ceb32 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -0,0 +1,27 @@ +package com.baeldung.kafka.message.ordering; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; + +import java.util.Properties; + +public class ProducerConfigurations { + public static void main(String[] args) { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put("max.in.flight.requests.per.connection", "1"); + props.put("batch.size", "16384"); + props.put("linger.ms", "5"); + KafkaProducer producer = new KafkaProducer<>(props); + + for (int i = 0; i < 10; i++) { + String key = "Key-" + (i % 3); // Assuming 3 partitions + producer.send(new ProducerRecord<>("multi_partition_topic", key, "Message-" + i)); + } + + producer.close(); + System.out.println("MultiPartitionProducer Completed."); + } +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java new file mode 100644 index 0000000000..932a29c394 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -0,0 +1,35 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; + +import java.time.Duration; +import java.util.Collections; +import java.util.Properties; + +public class SinglePartitionConsumer { + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); + + public static void main(String[] args) { + Properties props = new Properties(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + props.put("value.deserializer.serializedClass", Message.class); + Consumer consumer = new KafkaConsumer<>(props); + consumer.subscribe(Collections.singletonList("single_partition_topic")); + while (true) { + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + Message message = record.value(); + System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + }); + } + } +} + diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java new file mode 100644 index 0000000000..b5366819c5 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -0,0 +1,29 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerRecord; + +import java.util.Properties; +import java.util.Random; + +public class SinglePartitionProducer { + public static void main(String[] args) { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + + KafkaProducer producer = new KafkaProducer<>(props); + for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { + long messageId = Message.getRandomMessageId(); + String key = "Key-" + insertPosition; + Message message = new Message(insertPosition, messageId); + producer.send(new ProducerRecord<>("single_partition_topic", key, message)); + System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + } + producer.close(); + System.out.println("SinglePartitionProducer Completed."); + } + +} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java new file mode 100644 index 0000000000..b185d663d4 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -0,0 +1,36 @@ +package com.baeldung.kafka.message.ordering.payload; + +import java.util.Random; + +public class Message implements Comparable { + private long insertPosition; + private long messageId; + + public Message(){ + + } + + public Message(long insertPosition, long messageId) { + this.insertPosition = insertPosition; + this.messageId = messageId; + } + + public long getInsertPosition() { + return insertPosition; + } + + public long getMessageId() { + return messageId; + } + + @Override + public int compareTo(Message other) { + return Long.compare(this.messageId, other.messageId); + } + + public static long getRandomMessageId() { + Random rand = new Random(); + return rand.nextInt(1000); + } +} + diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java new file mode 100644 index 0000000000..34aa181fcb --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -0,0 +1,36 @@ +package com.baeldung.kafka.message.ordering.serialization; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.common.serialization.Deserializer; + +import java.util.Map; + +public class JacksonDeserializer implements Deserializer { + private final ObjectMapper objectMapper = new ObjectMapper(); + private Class tClass; + + public JacksonDeserializer(Class tClass) { + this.tClass = tClass; + } + + public JacksonDeserializer() { + + } + + @Override + public void configure(Map configs, boolean isKey) { + this.tClass = (Class) configs.get("value.deserializer.serializedClass"); + } + + @Override + public T deserialize(String topic, byte[] bytes) { + if (bytes == null) { + return null; + } + try { + return objectMapper.readValue(bytes, tClass); + } catch (Exception e) { + throw new RuntimeException("Error deserializing value", e); + } + } +} + diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java new file mode 100644 index 0000000000..fa9d25dd85 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java @@ -0,0 +1,20 @@ +package com.baeldung.kafka.message.ordering.serialization; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.common.serialization.Serializer; + +public class JacksonSerializer implements Serializer { + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public byte[] serialize(String topic, T data) { + if (data == null) { + return null; + } + try { + return objectMapper.writeValueAsBytes(data); + } catch (Exception e) { + throw new RuntimeException("Error serializing value", e); + } + } +} From 1f14b2366e06f6569252849ade6bc7c7b8bf9280 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 11 Oct 2023 14:05:40 +0530 Subject: [PATCH 056/831] BAEL-7005 Moving the article to a new project because the old project had reached it's limit --- .../spring-boot-security-1/pom.xml | 51 +++++++++++++++++++ .../SecuredEcommerceApplication.java | 0 .../controller/EcommerceController.java | 2 +- .../filter/AuditInterceptor.java | 0 .../security/EcommerceWebSecurityConfig.java | 0 .../SecureEcommerceApplicationUnitTest.java | 0 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-security-1/pom.xml rename spring-boot-modules/{spring-boot-security => spring-boot-security-1}/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java (100%) rename spring-boot-modules/{spring-boot-security => spring-boot-security-1}/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java (92%) rename spring-boot-modules/{spring-boot-security => spring-boot-security-1}/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java (100%) rename spring-boot-modules/{spring-boot-security => spring-boot-security-1}/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java (100%) rename spring-boot-modules/{spring-boot-security => spring-boot-security-1}/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java (100%) diff --git a/spring-boot-modules/spring-boot-security-1/pom.xml b/spring-boot-modules/spring-boot-security-1/pom.xml new file mode 100644 index 0000000000..42de046fa3 --- /dev/null +++ b/spring-boot-modules/spring-boot-security-1/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + spring-boot-security-1 + spring-boot-security-1 + jar + Spring Boot Security Auto-Configuration + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + org.springframework.boot + spring-boot-autoconfigure + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java b/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java rename to spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java b/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java similarity index 92% rename from spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java rename to spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java index 8f20baee10..d76075016a 100644 --- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java +++ b/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java @@ -13,7 +13,7 @@ public class EcommerceController { return "Show Cart"; } - //can we accessed by both anonymous and authenticated users + //can be accessed by both anonymous and authenticated users @GetMapping("/public/showProducts") public @ResponseBody String listProducts() { return "List Products"; diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java b/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java similarity index 100% rename from spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java rename to spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java b/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java rename to spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java diff --git a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java b/spring-boot-modules/spring-boot-security-1/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java rename to spring-boot-modules/spring-boot-security-1/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java From d4d4a0e1a408eb9a2d9924101de37ab7919ec861 Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Wed, 11 Oct 2023 11:09:45 +0100 Subject: [PATCH 057/831] BAEL-6895 extend String format test to cover negatives --- .../baeldung/truncatedouble/TruncateDoubleUnitTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java index d5881c5d66..1bbca4069f 100644 --- a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/truncatedouble/TruncateDoubleUnitTest.java @@ -61,9 +61,13 @@ public class TruncateDoubleUnitTest { @Test public void givenADouble_whenUsingStringFormat_truncateToTwoDecimalPlaces() { - double value = 1.55555555; - String truncated = String.format("%.2f", value); + double positive = 1.55555555; + String truncated = String.format("%.2f", positive); assertEquals("1.56", truncated); + + double negative = -1.55555555; + String negativeTruncated = String.format("%.2f", negative); + assertEquals("-1.56", negativeTruncated); } } From 23124ab6f81536cb1a7e242d9caad1aead3fdf14 Mon Sep 17 00:00:00 2001 From: Vinay Mhatre <90505086+SamsterZero@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:26:22 +0530 Subject: [PATCH 058/831] To change default redirect Previously after logging in we used to get the desired index page, but the address bar still had the "/login" in the address bar, this code fixes that --- .../com/baeldung/customuserdetails/SecurityConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java index cfec910ce9..d438aefcdc 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java @@ -28,7 +28,7 @@ public class SecurityConfiguration { .formLogin() .loginPage("/login") .permitAll() - .successForwardUrl("/index") + .defaultSuccessUrl("/index") .and() .logout() .permitAll() From f1669336a8e2567c7b50c357d60d13eb80a9827a Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 11 Oct 2023 22:43:12 +0530 Subject: [PATCH 059/831] BAEL-7005 Moving the article to a new project because the old project had reached it's limit --- .../{spring-boot-security-1 => spring-boot-security-2}/pom.xml | 2 +- .../permitallanonymous/SecuredEcommerceApplication.java | 0 .../permitallanonymous/controller/EcommerceController.java | 0 .../baeldung/permitallanonymous/filter/AuditInterceptor.java | 0 .../permitallanonymous/security/EcommerceWebSecurityConfig.java | 0 .../permitallanonymous/SecureEcommerceApplicationUnitTest.java | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/pom.xml (96%) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java (100%) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java (100%) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java (100%) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java (100%) rename spring-boot-modules/{spring-boot-security-1 => spring-boot-security-2}/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java (100%) diff --git a/spring-boot-modules/spring-boot-security-1/pom.xml b/spring-boot-modules/spring-boot-security-2/pom.xml similarity index 96% rename from spring-boot-modules/spring-boot-security-1/pom.xml rename to spring-boot-modules/spring-boot-security-2/pom.xml index 42de046fa3..db094f33a6 100644 --- a/spring-boot-modules/spring-boot-security-1/pom.xml +++ b/spring-boot-modules/spring-boot-security-2/pom.xml @@ -3,7 +3,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-boot-security-1 + spring-boot-security-2 spring-boot-security-1 jar Spring Boot Security Auto-Configuration diff --git a/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java b/spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java rename to spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/SecuredEcommerceApplication.java diff --git a/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java b/spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java similarity index 100% rename from spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java rename to spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/controller/EcommerceController.java diff --git a/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java b/spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java similarity index 100% rename from spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java rename to spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/filter/AuditInterceptor.java diff --git a/spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java b/spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-security-1/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java rename to spring-boot-modules/spring-boot-security-2/src/main/java/com/baeldung/permitallanonymous/security/EcommerceWebSecurityConfig.java diff --git a/spring-boot-modules/spring-boot-security-1/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java b/spring-boot-modules/spring-boot-security-2/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-security-1/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java rename to spring-boot-modules/spring-boot-security-2/src/test/java/com/baeldung/permitallanonymous/SecureEcommerceApplicationUnitTest.java From 28ecebc3acb3522b9ee176863925c184b61f0f97 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 11 Oct 2023 22:55:22 +0530 Subject: [PATCH 060/831] BAEL-7005 Moving the article to a new project because the old project had reached it's limit --- .../{spring-boot-3-1 => spring-boot-3-2}/pom.xml | 2 +- .../connectiondetails/ConnectionDetailsApplication.java | 0 .../com/baeldung/connectiondetails/adapter/VaultAdapter.java | 0 .../configuration/CustomCassandraConnectionDetails.java | 0 .../CustomCassandraConnectionDetailsConfiguration.java | 0 .../configuration/CustomCouchBaseConnectionDetails.java | 0 .../CustomCouchBaseConnectionDetailsConfiguration.java | 0 .../configuration/CustomElasticsearchConnectionDetails.java | 0 .../CustomElasticsearchConnectionDetailsConfiguration.java | 0 .../configuration/CustomKafkaConnectionDetails.java | 0 .../CustomKafkaConnectionDetailsConfiguration.java | 0 .../configuration/CustomNeo4jConnectionDetails.java | 0 .../CustomNeo4jConnectionDetailsConfiguration.java | 0 .../configuration/CustomZipkinConnectionDetails.java | 0 .../CustomZipkinConnectionDetailsConfiguration.java | 0 .../configuration/JdbcConnectionDetailsConfiguration.java | 0 .../configuration/MongoDBConnectionDetails.java | 0 .../configuration/MongoDBConnectionDetailsConfiguration.java | 0 .../configuration/PostgresConnectionDetails.java | 0 .../configuration/R2dbcPostgresConnectionDetails.java | 0 .../R2dbcPostgresConnectionDetailsConfiguration.java | 0 .../configuration/RabbitMQConnectionDetails.java | 0 .../configuration/RabbitMQConnectionDetailsConfiguration.java | 0 .../configuration/RedisCacheConnectionDetails.java | 0 .../configuration/RedisConnectionDetailsConfiguration.java | 0 .../connectiondetails/controller/ZipkinDemoController.java | 0 .../com/baeldung/connectiondetails/entity/elastic/Person.java | 0 .../com/baeldung/connectiondetails/entity/neo4j/Person.java | 0 .../connectiondetails/application-cassandra.properties | 0 .../resources/connectiondetails/application-couch.properties | 0 .../resources/connectiondetails/application-elastic.properties | 0 .../resources/connectiondetails/application-jdbc.properties | 0 .../resources/connectiondetails/application-kafka.properties | 0 .../resources/connectiondetails/application-mongo.properties | 0 .../resources/connectiondetails/application-neo4j.properties | 0 .../resources/connectiondetails/application-r2dbc.properties | 0 .../resources/connectiondetails/application-rabbitmq.properties | 0 .../resources/connectiondetails/application-redis.properties | 0 .../resources/connectiondetails/application-zipkin.properties | 0 .../connectiondetails/docker/docker-compose-cassandra.yml | 0 .../resources/connectiondetails/docker/docker-compose-couch.yml | 0 .../connectiondetails/docker/docker-compose-elastic.yml | 0 .../resources/connectiondetails/docker/docker-compose-jdbc.yml | 0 .../resources/connectiondetails/docker/docker-compose-kafka.yml | 0 .../resources/connectiondetails/docker/docker-compose-mongo.yml | 0 .../resources/connectiondetails/docker/docker-compose-neo4j.yml | 0 .../connectiondetails/docker/docker-compose-rabbitmq.yml | 0 .../resources/connectiondetails/docker/docker-compose-redis.yml | 0 .../connectiondetails/docker/docker-compose-zipkin.yml | 0 .../plantuml/cassandra-connection-details-class-diag.puml | 0 .../plantuml/connection-details-sequence-design.puml | 0 .../plantuml/couch_connection_details_class_diag.puml | 0 .../plantuml/elasticsearch-connection-details-class-diag.puml | 0 .../plantuml/jdbcconnection-details-class-diag.puml | 0 .../plantuml/kafka-connectiondetails-class-diag.puml | 0 .../plantuml/mongodb-connection-details-class-diag.puml | 0 .../plantuml/neo4j-connection-details-class-diag.puml | 0 .../plantuml/r2dbcconnection-details-class-diag.puml | 0 .../plantuml/rabbitmq-connection-details-class-diag.puml | 0 .../plantuml/redis-connection-details-class-diagram.puml | 0 .../plantuml/zipkin-connection-details-class-diag.puml | 0 .../CassandraConnectionDetailsIntegrationTest.java | 0 .../CouchbaseConnectionDetailsIntegrationTest.java | 0 .../ElasticsearchConnectionDetailsIntegrationTest.java | 0 .../connectiondetails/JdbcConnectionDetailsIntegrationTest.java | 0 .../KafkaConnectionDetailsIntegrationTest.java | 0 .../MongoDBConnectionDetailsIntegrationTest.java | 0 .../Neo4jConnectionDetailsIntegrationTest.java | 0 .../R2dbcConnectionDetailsIntegrationTest.java | 0 .../RabbitmqConnectionDetailsIntegrationTest.java | 0 .../RedisCacheConnnectionDetailsIntegrationTest.java | 0 71 files changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/pom.xml (99%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-cassandra.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-couch.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-elastic.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-jdbc.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-kafka.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-mongo.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-neo4j.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-r2dbc.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-rabbitmq.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-redis.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/application-zipkin.properties (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-couch.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-redis.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java (100%) rename spring-boot-modules/{spring-boot-3-1 => spring-boot-3-2}/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java (100%) diff --git a/spring-boot-modules/spring-boot-3-1/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml similarity index 99% rename from spring-boot-modules/spring-boot-3-1/pom.xml rename to spring-boot-modules/spring-boot-3-2/pom.xml index 597f384ed8..88a60bf881 100644 --- a/spring-boot-modules/spring-boot-3-1/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -3,7 +3,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-boot-3-1 + spring-boot-3-2 0.0.1-SNAPSHOT spring-boot-3-1 Demo project for Spring Boot diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomCouchBaseConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomKafkaConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/CustomZipkinConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/controller/ZipkinDemoController.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-cassandra.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-cassandra.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-cassandra.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-couch.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-couch.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-couch.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-elastic.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-elastic.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-elastic.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-jdbc.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-jdbc.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-jdbc.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-kafka.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-kafka.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-kafka.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-mongo.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-mongo.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-mongo.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-neo4j.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-neo4j.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-neo4j.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-r2dbc.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-r2dbc.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-r2dbc.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-rabbitmq.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-rabbitmq.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-rabbitmq.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-redis.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-redis.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-redis.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-zipkin.properties similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/application-zipkin.properties rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/application-zipkin.properties diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-cassandra.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-couch.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-couch.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-couch.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-elastic.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-jdbc.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-kafka.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-mongo.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-neo4j.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-rabbitmq.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-redis.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-redis.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-redis.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/docker/docker-compose-zipkin.yml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/cassandra-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/connection-details-sequence-design.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/couch_connection_details_class_diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/elasticsearch-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/jdbcconnection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/kafka-connectiondetails-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/mongodb-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/neo4j-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/r2dbcconnection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/rabbitmq-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/redis-connection-details-class-diagram.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml rename to spring-boot-modules/spring-boot-3-2/src/main/resources/connectiondetails/plantuml/zipkin-connection-details-class-diag.puml diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3-1/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java From b60089275f70f8651b6439a967da7d2d57cb00de Mon Sep 17 00:00:00 2001 From: ovidiu-mihai98 <138307181+ovidiumihaitacu@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:58:43 +0300 Subject: [PATCH 061/831] Created another module for core-java-reflection --- .../core-java-reflection-3/README.md | 1 + .../core-java-reflection-3/pom.xml | 78 +++++++++++++++++++ .../disadvantages/encapsulation/MyClass.java | 0 .../performance/BenchmarkRunner.java | 0 .../performance/InitializationBenchmark.java | 0 .../MethodInvocationBenchmark.java | 0 .../disadvantages/performance/Person.java | 0 .../ReflectionEncapsulationUnitTest.java | 0 core-java-modules/pom.xml | 1 + 9 files changed, 80 insertions(+) create mode 100644 core-java-modules/core-java-reflection-3/README.md create mode 100644 core-java-modules/core-java-reflection-3/pom.xml rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java (100%) rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java (100%) rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java (100%) rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java (100%) rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java (100%) rename core-java-modules/{core-java-reflection-2 => core-java-reflection-3}/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java (100%) diff --git a/core-java-modules/core-java-reflection-3/README.md b/core-java-modules/core-java-reflection-3/README.md new file mode 100644 index 0000000000..e320af31b4 --- /dev/null +++ b/core-java-modules/core-java-reflection-3/README.md @@ -0,0 +1 @@ +### Relevant Articles: \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-3/pom.xml b/core-java-modules/core-java-reflection-3/pom.xml new file mode 100644 index 0000000000..fa5fe897e0 --- /dev/null +++ b/core-java-modules/core-java-reflection-3/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + core-java-reflection-3 + core-java-reflection-3 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.springframework + spring-test + ${spring.version} + test + + + org.reflections + reflections + ${reflections.version} + + + + + core-java-reflection-3 + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.version} + ${target.version} + -parameters + + + + org.jacoco + jacoco-maven-plugin + 0.8.8 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + + + + 0.9.12 + 1.8 + 1.8 + 5.3.4 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java rename to core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/encapsulation/MyClass.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java rename to core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/BenchmarkRunner.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java rename to core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/InitializationBenchmark.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java rename to core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/MethodInvocationBenchmark.java diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java b/core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java rename to core-java-modules/core-java-reflection-3/src/main/java/com/baeldung/reflection/disadvantages/performance/Person.java diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java b/core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java similarity index 100% rename from core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java rename to core-java-modules/core-java-reflection-3/src/test/java/com/baeldung/reflection/disadvantages/encapsulation/ReflectionEncapsulationUnitTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index d0cce5e66f..e32ed1dbca 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -155,6 +155,7 @@ core-java-properties core-java-reflection core-java-reflection-2 + core-java-reflection-3 core-java-scanner core-java-security-2 core-java-security-3 From 21df4c28e8640c2a7b99c95f2ebd6cf12f5971fb Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:02:10 +0800 Subject: [PATCH 062/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-testing-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-testing-2/README.md b/spring-boot-modules/spring-boot-testing-2/README.md index e6bc4c4590..1baf83bf34 100644 --- a/spring-boot-modules/spring-boot-testing-2/README.md +++ b/spring-boot-modules/spring-boot-testing-2/README.md @@ -13,4 +13,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Web Service Integration Tests with @WebServiceServerTest](https://www.baeldung.com/spring-webserviceservertest) - [Spring Boot – Testing Redis With Testcontainers](https://www.baeldung.com/spring-boot-redis-testcontainers) - [Spring Boot – Keycloak Integration Testing with Testcontainers](https://www.baeldung.com/spring-boot-keycloak-integration-testing) +- [Difference Between @Spy and @SpyBean](https://www.baeldung.com/spring-spy-vs-spybean) - More articles: [[<-- prev]](../spring-boot-testing) From 287a196f47f0ebf7226ee6822c450e57dca2583e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:05:31 +0800 Subject: [PATCH 063/831] Update README.md [skip ci] --- microservices-modules/micronaut/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/microservices-modules/micronaut/README.md b/microservices-modules/micronaut/README.md index 1ab31d0c0c..f784f8ad70 100644 --- a/microservices-modules/micronaut/README.md +++ b/microservices-modules/micronaut/README.md @@ -5,3 +5,4 @@ This module contains articles about Micronaut. ### Relevant Articles: - [Introduction to Micronaut Framework](https://www.baeldung.com/micronaut) - [Micronaut vs. Spring Boot](https://www.baeldung.com/micronaut-vs-spring-boot) +- [API Versioning in Micronaut](https://www.baeldung.com/java-api-versioning-micronaut) From 475111027f3ba21d06ec5cd85000ccfbfb7124b1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:13:08 +0800 Subject: [PATCH 064/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-6/README.md b/core-java-modules/core-java-numbers-6/README.md index 3bd9fe6ddb..e3d5454d60 100644 --- a/core-java-modules/core-java-numbers-6/README.md +++ b/core-java-modules/core-java-numbers-6/README.md @@ -5,4 +5,5 @@ - [Does Java Read Integers in Little Endian or Big Endian?](https://www.baeldung.com/java-integers-little-big-endian) - [How to Split an Integer Number Into Digits in Java](https://www.baeldung.com/java-integer-individual-digits) - [Java Double vs. BigDecimal](https://www.baeldung.com/java-double-vs-bigdecimal) +- [Finding the Square Root of a BigInteger in Java](https://www.baeldung.com/java-find-square-root-biginteger) - More articles: [[<-- prev]](../core-java-numbers-5) From 5f1c499ceac9fd5506c67a608a52c1daa493729d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:18:05 +0800 Subject: [PATCH 065/831] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index dec4a7a0cb..e7c58a0eb2 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -3,3 +3,4 @@ - [Working With Empty Stream in Java](https://www.baeldung.com/java-empty-stream) - [Aggregate Runtime Exceptions in Java Streams](https://www.baeldung.com/java-streams-aggregate-exceptions) - [Streams vs. Loops in Java](https://www.baeldung.com/java-streams-vs-loops) +- [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream) From c87483b758752f9f71f5238fefa0221032c3729d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:22:52 +0800 Subject: [PATCH 066/831] Update README.md [skip ci] --- spring-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md index d71e75f15c..318312ace6 100644 --- a/spring-kafka-2/README.md +++ b/spring-kafka-2/README.md @@ -7,3 +7,4 @@ This module contains articles about Spring with Kafka - [Implementing Retry in Kafka Consumer](https://www.baeldung.com/spring-retry-kafka-consumer) - [Spring Kafka: Configure Multiple Listeners on Same Topic](https://www.baeldung.com/spring-kafka-multiple-listeners-same-topic) - [Understanding Kafka Topics and Partitions](https://www.baeldung.com/kafka-topics-partitions) +- [How to Subscribe a Kafka Consumer to Multiple Topics](https://www.baeldung.com/kafka-subscribe-consumer-multiple-topics) From 80a01d78cdc1d12ab4562190b492317eaf94e56c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 12 Oct 2023 05:26:40 +0800 Subject: [PATCH 067/831] Update README.md [skip ci] --- core-java-modules/core-java-arrays-convert/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md index dcaaaac12e..2e34829525 100644 --- a/core-java-modules/core-java-arrays-convert/README.md +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -10,3 +10,4 @@ This module contains articles about arrays conversion in Java - [Convert Java Array to Iterable](https://www.baeldung.com/java-array-convert-to-iterable) - [Converting an int[] to HashSet in Java](https://www.baeldung.com/java-converting-int-array-to-hashset) - [Convert an ArrayList of String to a String Array in Java](https://www.baeldung.com/java-convert-string-arraylist-array) +- [Convert Char Array to Int Array in Java](https://www.baeldung.com/java-convert-char-int-array) From d083e32b1a9faa1b41edac9d03361a5508f5aee8 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Wed, 11 Oct 2023 23:36:00 +0200 Subject: [PATCH 068/831] Update README.md --- core-java-modules/core-java-reflection-3/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-reflection-3/README.md b/core-java-modules/core-java-reflection-3/README.md index e320af31b4..d997aa22f1 100644 --- a/core-java-modules/core-java-reflection-3/README.md +++ b/core-java-modules/core-java-reflection-3/README.md @@ -1 +1,2 @@ -### Relevant Articles: \ No newline at end of file +### Relevant Articles: +- [Is Java Reflection Bad Practice?](https://www.baeldung.com/java-reflection-bad-practice) From d64af6f9acde8202d3468cd908c7fc1a306bfef0 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 12 Oct 2023 02:46:22 +0200 Subject: [PATCH 069/831] [record-field-reflection] Get All Record Fields and Its Values via Reflection (#14933) --- ...dRecordPropertiesByReflectionUnitTest.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-17/src/test/java/com/baeldung/recordproperties/ReadRecordPropertiesByReflectionUnitTest.java diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/recordproperties/ReadRecordPropertiesByReflectionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/recordproperties/ReadRecordPropertiesByReflectionUnitTest.java new file mode 100644 index 0000000000..4ffe3ecbeb --- /dev/null +++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/recordproperties/ReadRecordPropertiesByReflectionUnitTest.java @@ -0,0 +1,89 @@ +package com.baeldung.recordproperties; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.lang.reflect.Field; +import java.lang.reflect.RecordComponent; +import java.util.ArrayList; + +import org.junit.jupiter.api.Test; + +record Player(String name, int age, Long score) { +} + +public class ReadRecordPropertiesByReflectionUnitTest { + private static final Player ERIC = new Player("Eric", 28, 4242L); + + @Test + void whenUsingRecordComponent_thenGetExpectedResult() { + var fields = new ArrayList(); + RecordComponent[] components = Player.class.getRecordComponents(); + for (var comp : components) { + try { + Field field = ERIC.getClass() + .getDeclaredField(comp.getName()); + field.setAccessible(true); + fields.add(field); + } catch (NoSuchFieldException e) { + // for simplicity, error handling is skipped + } + } + + assertEquals(3, fields.size()); + + var nameField = fields.get(0); + var ageField = fields.get(1); + var scoreField = fields.get(2); + try { + assertEquals("name", nameField.getName()); + assertEquals(String.class, nameField.getType()); + assertEquals("Eric", nameField.get(ERIC)); + + assertEquals("age", ageField.getName()); + assertEquals(int.class, ageField.getType()); + assertEquals(28, ageField.get(ERIC)); + + assertEquals("score", scoreField.getName()); + assertEquals(Long.class, scoreField.getType()); + assertEquals(4242L, scoreField.get(ERIC)); + } catch (IllegalAccessException exception) { + // for simplicity, error handling is skipped + } + + } + + @Test + void whenUsingClassGetDeclaredField_thenGetExpectedResult() { + // record has no public fields + assertEquals(0, Player.class.getFields().length); + + var fields = new ArrayList(); + for (var field : Player.class.getDeclaredFields()) { + field.setAccessible(true); + fields.add(field); + } + + assertEquals(3, fields.size()); + var nameField = fields.get(0); + var ageField = fields.get(1); + var scoreField = fields.get(2); + + try { + assertEquals("name", nameField.getName()); + assertEquals(String.class, nameField.getType()); + assertEquals("Eric", nameField.get(ERIC)); + + assertEquals("age", ageField.getName()); + assertEquals(int.class, ageField.getType()); + assertEquals(28, ageField.get(ERIC)); + + assertEquals("score", scoreField.getName()); + assertEquals(Long.class, scoreField.getType()); + assertEquals(4242L, scoreField.get(ERIC)); + } catch (IllegalAccessException ex) { + // for simplicity, error handling is skipped + } + + } + +} \ No newline at end of file From d6cedbf2fbce9480ac0e1e5619dd5cf26680a262 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Thu, 12 Oct 2023 10:26:33 +0300 Subject: [PATCH 070/831] This commit related to the article BAEL-6784 (#14900) This commit aims to add a new test class to split Java String into Key-Value pairs --- .../StringSplitKeyValueUnitTest.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringsplitkeyvalue/StringSplitKeyValueUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringsplitkeyvalue/StringSplitKeyValueUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringsplitkeyvalue/StringSplitKeyValueUnitTest.java new file mode 100644 index 0000000000..25f68ff373 --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringsplitkeyvalue/StringSplitKeyValueUnitTest.java @@ -0,0 +1,80 @@ +package com.baeldung.stringsplitkeyvalue; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StringSplitKeyValueUnitTest { + +@Test +public void givenStringData_whenUsingTokenizer_thenTokenizeAndValidate() { + String data = "name=John age=30 city=NewYork"; + StringTokenizer tokenizer = new StringTokenizer(data); + + // Create a map to store key-value pairs + Map keyValueMap = new HashMap<>(); + + while (tokenizer.hasMoreTokens()) { + String token = tokenizer.nextToken(); + String[] keyValue = token.split("="); + + if (keyValue.length == 2) { + String key = keyValue[0]; + String value = keyValue[1]; + + // Store key-value pairs in the map + keyValueMap.put(key, value); + } + } + + // Use assertions to validate the key-value pairs in the map + assertEquals("John", keyValueMap.get("name")); + assertEquals("30", keyValueMap.get("age")); + assertEquals("NewYork", keyValueMap.get("city")); +} + + +@Test +public void givenDataWithPattern_whenUsingMatcher_thenPerformPatternMatching() { + String data = "name=John,age=30;city=NewYork"; + Pattern pattern = Pattern.compile("\\b(\\w+)=(\\w+)\\b"); + Matcher matcher = pattern.matcher(data); + + // Create a map to store key-value pairs + Map keyValueMap = new HashMap<>(); + + while (matcher.find()) { + String key = matcher.group(1); + String value = matcher.group(2); + + // Store key-value pairs in the map + keyValueMap.put(key, value); + } + + // Use assertions to validate the key-value pairs in the map + assertEquals("John", keyValueMap.get("name")); + assertEquals("30", keyValueMap.get("age")); + assertEquals("NewYork", keyValueMap.get("city")); +} + + @Test + public void givenStringData_whenUsingJavaMap_thenSplitAndValidate() { + String data = "name=John age=30 city=NewYork"; + Map keyValueMap = Arrays.stream(data.split(" ")) + .map(kv -> kv.split("=")) + .filter(kvArray -> kvArray.length == 2) + .collect(Collectors.toMap(kv -> kv[0], kv -> kv[1])); + + assertEquals("John", keyValueMap.get("name")); + assertEquals("30", keyValueMap.get("age")); + assertEquals("NewYork", keyValueMap.get("city")); + } +} From 99790fd04683350ff6d1a7e299dd8d3c4d9a2444 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 12 Oct 2023 15:18:26 +0530 Subject: [PATCH 071/831] backlink updated --- javaxval/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javaxval/README.md b/javaxval/README.md index be8c3b51b7..188c2e59d0 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -7,7 +7,7 @@ This module contains articles about Bean Validation. - [Validating Container Elements with Jakarta Bean Validation 3.0](https://www.baeldung.com/bean-validation-container-elements) - [Validations for Enum Types](https://www.baeldung.com/javax-validations-enums) - [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) -- [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups) +- [Grouping Jakarta (Javax) Validation Constraints](https://www.baeldung.com/javax-validation-groups) - [Constraint Composition with Bean Validation](https://www.baeldung.com/java-bean-validation-constraint-composition) - [Using @NotNull on a Method Parameter](https://www.baeldung.com/java-notnull-method-parameter) - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) From a55509843322ca32c4eb75dc7c2310774ab448cc Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 12 Oct 2023 15:24:05 +0530 Subject: [PATCH 072/831] Update README.md --- persistence-modules/spring-hibernate-6/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-6/README.md b/persistence-modules/spring-hibernate-6/README.md index 08fe6216fd..86a1c919f3 100644 --- a/persistence-modules/spring-hibernate-6/README.md +++ b/persistence-modules/spring-hibernate-6/README.md @@ -6,4 +6,4 @@ This module contains articles about Hibernate 6 with Spring. - [Programmatic Transactions in the Spring TestContext Framework](https://www.baeldung.com/spring-test-programmatic-transactions) - [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate) -- [Bootstrapping Hibernate 5 with Spring](https://www.baeldung.com/hibernate-5-spring) +- [Bootstrapping Hibernate with Spring](https://www.baeldung.com/hibernate-spring) From 19a5a32d0f7dfa25d39df4f8e2ee03dab513237a Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Thu, 12 Oct 2023 12:18:44 +0200 Subject: [PATCH 073/831] BAEL-3438: small fix --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties index a6733dc397..875253c79e 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/application.properties @@ -12,5 +12,5 @@ spring.datasource.url=jdbc:h2:mem:baeldung spring.jpa.show-sql=false #hibernate.dialect=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto= create +spring.jpa.hibernate.ddl-auto=create spring.jpa.properties.hibernate.id.new_generator_mappings=false \ No newline at end of file From 0bf14c03f5b377eb5663a6e58d2ba143fc6ae047 Mon Sep 17 00:00:00 2001 From: Thibault Faure Date: Sat, 2 Sep 2023 17:20:39 +0200 Subject: [PATCH 074/831] BAEL-6591 Code for the Wrapping a String After a Number of Characters World-Wise in Java article --- .../core-java-string-algorithms-3/pom.xml | 6 ++ .../wrappingcharacterwise/Wrapper.java | 28 +++++++++ .../WrapperUnitTest.java | 62 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/wrappingcharacterwise/Wrapper.java create mode 100644 core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/wrappingcharacterwise/WrapperUnitTest.java diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml index 536175acc2..507e830e8a 100644 --- a/core-java-modules/core-java-string-algorithms-3/pom.xml +++ b/core-java-modules/core-java-string-algorithms-3/pom.xml @@ -28,6 +28,11 @@ emoji-java ${emoji-java.version} + + org.apache.commons + commons-text + ${apache-commons-text.version} + @@ -58,6 +63,7 @@ 1.7 3.12.0 5.1.1 + 1.10.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/wrappingcharacterwise/Wrapper.java b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/wrappingcharacterwise/Wrapper.java new file mode 100644 index 0000000000..7400745b2f --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/main/java/com/baeldung/wrappingcharacterwise/Wrapper.java @@ -0,0 +1,28 @@ +package com.baeldung.wrappingcharacterwise; + +import java.lang.IllegalArgumentException; +import java.lang.String; +import java.lang.StringBuilder; + +public class Wrapper { + + public String wrapStringCharacterWise(String input, int n) { + StringBuilder stringBuilder = new StringBuilder(input); + int index = 0; + while(stringBuilder.length() > index + n) { + int lastLineReturn = stringBuilder.lastIndexOf("\n", index + n); + if (lastLineReturn > index) { + index = lastLineReturn; + } else { + index = stringBuilder.lastIndexOf(" ", index + n); + if (index == -1) { + throw new IllegalArgumentException("impossible to slice " + stringBuilder.substring(0, n)); + } + stringBuilder.replace(index, index + 1, "\n"); + index++; + } + } + return stringBuilder.toString(); + } + +} diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/wrappingcharacterwise/WrapperUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/wrappingcharacterwise/WrapperUnitTest.java new file mode 100644 index 0000000000..8dcc323f7b --- /dev/null +++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/wrappingcharacterwise/WrapperUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.wrappingcharacterwise; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.apache.commons.text.WordUtils; +import org.junit.jupiter.api.Test; + +public class WrapperUnitTest { + + Wrapper wrapper = new Wrapper(); + String lineSeparator = System.lineSeparator(); + + @Test + void givenStringWithLessThanNCharacters_whenWrapStringCharacterWise_thenUnchanged() { + String input = "short sentence"; + assertEquals(input, wrapper.wrapStringCharacterWise(input, 20)); + } + + @Test + void givenStringWithMoreThanNCharacters_whenWrapStringCharacterWise_thenCorrectlyWrapped() { + String input = "Baeldung is a popular website that provides in-depth tutorials and articles on various programming and software development topics, primarily focused on Java and related technologies."; + assertEquals("Baeldung is a\npopular website that\nprovides in-depth\ntutorials and\narticles on various\nprogramming and\nsoftware development\ntopics, primarily\nfocused on Java and\nrelated\ntechnologies.", wrapper.wrapStringCharacterWise(input, 20)); + } + + @Test + void givenStringWithATooLongWord_whenWrapStringCharacterWise_thenThrows() { + String input = "The word straightforward has more than 10 characters"; + assertThrows(IllegalArgumentException.class, () -> wrapper.wrapStringCharacterWise(input, 10)); + } + + @Test + void givenStringWithLineReturns_whenWrapStringCharacterWise_thenWrappedAccordingly() { + String input = "Baeldung\nis a popular website that provides in-depth tutorials and articles on various programming and software development topics, primarily focused on Java and related technologies."; + assertEquals("Baeldung\nis a popular\nwebsite that\nprovides in-depth\ntutorials and\narticles on various\nprogramming and\nsoftware development\ntopics, primarily\nfocused on Java and\nrelated\ntechnologies.", wrapper.wrapStringCharacterWise(input, 20)); + } + + @Test + void givenStringWithLessThanNCharacters_whenWrap_thenUnchanged() { + String input = "short sentence"; + assertEquals(input, WordUtils.wrap(input, 20)); + } + + @Test + void givenStringWithMoreThanNCharacters_whenWrap_thenCorrectlyWrapped() { + String input = "Baeldung is a popular website that provides in-depth tutorials and articles on various programming and software development topics, primarily focused on Java and related technologies."; + assertEquals("Baeldung is a" + lineSeparator + "popular website that" + lineSeparator + "provides in-depth" + lineSeparator + "tutorials and" + lineSeparator + "articles on various" + lineSeparator + "programming and" + lineSeparator + "software development" + lineSeparator + "topics, primarily" + lineSeparator + "focused on Java and" + lineSeparator + "related" + lineSeparator + "technologies.", WordUtils.wrap(input, 20)); + } + + @Test + void givenStringWithATooLongWord_whenWrap_thenLongWordIsNotWrapped() { + String input = "The word straightforward has more than 10 characters"; + assertEquals("The word" + lineSeparator + "straightforward" + lineSeparator + "has more" + lineSeparator + "than 10" + lineSeparator + "characters", WordUtils.wrap(input, 10)); + } + + @Test + void givenStringWithLineReturns_whenWrap_thenWrappedLikeThereWasNone() { + String input = "Baeldung" + lineSeparator + "is a popular website that provides in-depth tutorials and articles on various programming and software development topics, primarily focused on Java and related technologies."; + assertEquals("Baeldung" + lineSeparator + "is a" + lineSeparator + "popular website that" + lineSeparator + "provides in-depth" + lineSeparator + "tutorials and" + lineSeparator + "articles on various" + lineSeparator + "programming and" + lineSeparator + "software development" + lineSeparator + "topics, primarily" + lineSeparator + "focused on Java and" + lineSeparator + "related" + lineSeparator + "technologies.", WordUtils.wrap(input, 20)); + } + +} From 7b8fdd352b684d87c1ea45f2eff512100f086912 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 13 Oct 2023 05:49:16 +0800 Subject: [PATCH 075/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-security/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-security/README.md b/spring-boot-modules/spring-boot-security/README.md index 2fd9e77c92..64a7a69e3a 100644 --- a/spring-boot-modules/spring-boot-security/README.md +++ b/spring-boot-modules/spring-boot-security/README.md @@ -11,7 +11,6 @@ This module contains articles about Spring Boot Security - [Disable Security for a Profile in Spring Boot](https://www.baeldung.com/spring-security-disable-profile) - [Spring @EnableWebSecurity vs. @EnableGlobalMethodSecurity](https://www.baeldung.com/spring-enablewebsecurity-vs-enableglobalmethodsecurity) - [Spring Security – Configuring Different URLs](https://www.baeldung.com/spring-security-configuring-urls) -- [Difference Between permitAll() and anonymous() in Spring Security](https://www.baeldung.com/spring-security-permitall-vs-anonymous) ### Spring Boot Security Auto-Configuration From 0a186781d3d84109ed1c88bc4ab5600158e9b843 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 13 Oct 2023 05:49:54 +0800 Subject: [PATCH 076/831] Create README.md [skip ci] --- spring-boot-modules/spring-boot-security-2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-security-2/README.md diff --git a/spring-boot-modules/spring-boot-security-2/README.md b/spring-boot-modules/spring-boot-security-2/README.md new file mode 100644 index 0000000000..2774f60c43 --- /dev/null +++ b/spring-boot-modules/spring-boot-security-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Difference Between permitAll() and anonymous() in Spring Security](https://www.baeldung.com/spring-security-permitall-vs-anonymous) From e9627963ef91a9e0e1749de25670dd4d91f67082 Mon Sep 17 00:00:00 2001 From: ulisses Date: Fri, 13 Oct 2023 02:39:34 -0300 Subject: [PATCH 077/831] include header --- .../src/main/java/com/baeldung/httpclient/HttpClientPost.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java index d08a7bf183..5c62bf73d9 100644 --- a/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java +++ b/core-java-modules/core-java-httpclient/src/main/java/com/baeldung/httpclient/HttpClientPost.java @@ -123,6 +123,7 @@ public class HttpClientPost { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(serviceUrl)) + .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(getFormDataAsString(formData))) .build(); From d63c7a93cc91b70e88e91cb47cfbc185c589fb79 Mon Sep 17 00:00:00 2001 From: ulisseslima Date: Fri, 13 Oct 2023 02:52:08 -0300 Subject: [PATCH 078/831] rollback --- .github/ISSUE_TEMPLATE/bug_report.md | 36 ++++++++++++---------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index d6d5d3c8fe..26eb32761c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,14 +1,14 @@ --- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: '' -assignees: '' - +name: Issue Report +about: Report an issue to help us improve +title: '[ISSUE] ' --- -**Describe the bug** -A clear and concise description of what the bug is. +**Article and Module Links** +A link to the affected article and the affected module. You can find the link to the module in the Conclusion section in the "on Github" standard phase. + +**Describe the Issue** +A clear and concise description of what the issue is. **To Reproduce** Steps to reproduce the behavior: @@ -17,22 +17,16 @@ Steps to reproduce the behavior: 3. Scroll down to '....' 4. See error -**Expected behavior** +**Expected Behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] +**Environment (please complete the following information):** +- OS: [e.g. Windows] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. +**Additional Context** +Add any other context about the issue here. \ No newline at end of file From a9f6f956c4d4119ed1007a1729838f140db9ee03 Mon Sep 17 00:00:00 2001 From: ulisseslima Date: Fri, 13 Oct 2023 02:53:18 -0300 Subject: [PATCH 079/831] remove old template --- .github/ISSUE_TEMPLATE/bug_report.md | 32 ---------------------------- 1 file changed, 32 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 26eb32761c..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Issue Report -about: Report an issue to help us improve -title: '[ISSUE] ' ---- - -**Article and Module Links** -A link to the affected article and the affected module. You can find the link to the module in the Conclusion section in the "on Github" standard phase. - -**Describe the Issue** -A clear and concise description of what the issue is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected Behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Environment (please complete the following information):** -- OS: [e.g. Windows] -- Browser [e.g. chrome, safari] -- Version [e.g. 22] - -**Additional Context** -Add any other context about the issue here. \ No newline at end of file From 2adc6c45c0976c2e7bc8eae5bd96abd03751d309 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 13 Oct 2023 09:53:16 +0300 Subject: [PATCH 080/831] JAVA-22208 spring cloud eureka to jdk17 (#14859) * JAVA-22208 Spring-cloud-eureka upgrade to JDK 17 * JAVA-22208 Code cleaning * JAVA-22208 clean up * JAVA-22208 Review changes * JAVA-22208 Removed duplicated circuit-breaker reference --- pom.xml | 4 + spring-cloud-modules/pom.xml | 3 +- .../spring-cloud-eureka/pom.xml | 2 - .../pom.xml | 30 ++++- .../spring/cloud/client/BooksClient.java | 13 +- .../client/BooksClientIntegrationTest.java | 6 + .../cloud/client/EurekaContainerConfig.java | 3 - ...oadBalancerBooksClientIntegrationTest.java | 81 ++++++++++++- .../client/LoadBalancerIntegrationTest.java | 112 ++++++++++++++++++ .../spring/cloud/client/RibbonTestConfig.java | 41 ------- .../spring/cloud/client/TestConfig.java | 24 ++++ .../spring/cloud/client/WireMockConfig.java | 6 +- .../resources/application-ribbon-test.yml | 3 - ...application-spring-cloud-balancer-test.yml | 19 +++ .../src/test/resources/application-test.yml | 24 ++-- 15 files changed, 302 insertions(+), 69 deletions(-) create mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java delete mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/RibbonTestConfig.java create mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java delete mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-ribbon-test.yml create mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml diff --git a/pom.xml b/pom.xml index 197074c455..5d8358f05e 100644 --- a/pom.xml +++ b/pom.xml @@ -726,9 +726,11 @@ spring-cloud-modules/spring-cloud-circuit-breaker spring-cloud-modules/spring-cloud-contract spring-cloud-modules/spring-cloud-data-flow + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-stream-starters spring-cloud-modules/spring-cloud-zuul-eureka-integration + spring-exceptions spring-jenkins-pipeline spring-core @@ -1004,11 +1006,13 @@ spring-drools spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-contract spring-cloud-modules/spring-cloud-data-flow spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-stream-starters spring-cloud-modules/spring-cloud-zuul-eureka-integration + spring-exceptions spring-jenkins-pipeline spring-core diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index b21b208414..a098bc90a9 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -19,7 +19,8 @@ spring-cloud-loadbalancer spring-cloud-config - spring-cloud-eureka + + spring-cloud-hystrix spring-cloud-bootstrap spring-cloud-ribbon-client diff --git a/spring-cloud-modules/spring-cloud-eureka/pom.xml b/spring-cloud-modules/spring-cloud-eureka/pom.xml index 23523f2c2f..599853c675 100644 --- a/spring-cloud-modules/spring-cloud-eureka/pom.xml +++ b/spring-cloud-modules/spring-cloud-eureka/pom.xml @@ -45,8 +45,6 @@ - 2.1.2.RELEASE - Greenwich.RELEASE 2.17.1 diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml index 4fdfe2d9c2..08a85d191a 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml @@ -41,7 +41,7 @@ org.springframework.cloud - spring-cloud-starter-netflix-ribbon + spring-cloud-starter-loadbalancer org.springframework.cloud @@ -51,6 +51,20 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-webflux + + + io.projectreactor + reactor-test + test + + + org.springframework.boot + spring-boot-starter-test + 2.6.8 + com.github.tomakehurst wiremock @@ -75,9 +89,18 @@ + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/release + + + + org.apache.maven.plugins maven-surefire-plugin 1 @@ -87,4 +110,9 @@ + + 17 + 17 + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/main/java/com/baeldung/spring/cloud/client/BooksClient.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/main/java/com/baeldung/spring/cloud/client/BooksClient.java index a263624b28..97d8643e19 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/main/java/com/baeldung/spring/cloud/client/BooksClient.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/main/java/com/baeldung/spring/cloud/client/BooksClient.java @@ -1,16 +1,15 @@ package com.baeldung.spring.cloud.client; -import com.baeldung.spring.cloud.model.Book; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.RequestMapping; - import java.util.List; -@FeignClient("books-service") -//@FeignClient(value="simple-books-client", url="${book.service.url}") +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.baeldung.spring.cloud.model.Book; + +@FeignClient(name = "books-service") public interface BooksClient { @RequestMapping("/books") List getBooks(); - } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/BooksClientIntegrationTest.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/BooksClientIntegrationTest.java index 2842eef435..7f4807e356 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/BooksClientIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/BooksClientIntegrationTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -21,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest @ActiveProfiles("test") +@EnableFeignClients @EnableConfigurationProperties @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { WireMockConfig.class }) @@ -29,12 +31,16 @@ class BooksClientIntegrationTest { @Autowired private WireMockServer mockBooksService; + @Autowired + private WireMockServer mockBooksService2; + @Autowired private BooksClient booksClient; @BeforeEach void setUp() throws IOException { setupMockBooksResponse(mockBooksService); + setupMockBooksResponse(mockBooksService2); } @Test diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/EurekaContainerConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/EurekaContainerConfig.java index 6747d14b88..10ea3ffa34 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/EurekaContainerConfig.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/EurekaContainerConfig.java @@ -31,9 +31,6 @@ public class EurekaContainerConfig { + eurekaServer.getFirstMappedPort().toString() + "/eureka") .applyTo(configurableApplicationContext); - } - } - } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java index f05df11ba3..5690c24d77 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java @@ -9,23 +9,39 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; +import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.io.IOException; +import java.util.Arrays; +import java.util.List; import static com.baeldung.spring.cloud.client.BookMocks.setupMockBooksResponse; import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.moreThan; import static java.util.Arrays.asList; +import static org.assertj.core.api.BDDAssertions.then; import static org.junit.jupiter.api.Assertions.assertTrue; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + @SpringBootTest -@ActiveProfiles("ribbon-test") +@ActiveProfiles("test") @EnableConfigurationProperties +@EnableFeignClients @ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { RibbonTestConfig.class }) +@ContextConfiguration(classes = { TestConfig.class }) class LoadBalancerBooksClientIntegrationTest { @Autowired @@ -37,10 +53,22 @@ class LoadBalancerBooksClientIntegrationTest { @Autowired private BooksClient booksClient; + @Autowired + private LoadBalancerClientFactory clientFactory; + @BeforeEach void setUp() throws IOException { setupMockBooksResponse(mockBooksService); setupMockBooksResponse(secondMockBooksService); + + String serviceId = "books-service"; + RoundRobinLoadBalancer loadBalancer = new RoundRobinLoadBalancer(ServiceInstanceListSuppliers + .toProvider(serviceId, instance(serviceId, "localhost", false), instance(serviceId, "localhost", true)), + serviceId, -1); + } + + private static DefaultServiceInstance instance(String serviceId, String host, boolean secure) { + return new DefaultServiceInstance(serviceId, serviceId, host, 80, secure); } @Test @@ -62,4 +90,53 @@ class LoadBalancerBooksClientIntegrationTest { new Book("Dune", "Frank Herbert"), new Book("Foundation", "Isaac Asimov")))); } + + @Test + void loadbalancerWorks() throws IOException { + + setupMockBooksResponse(mockBooksService); + setupMockBooksResponse(secondMockBooksService); + + ReactiveLoadBalancer reactiveLoadBalancer = this.clientFactory.getInstance("books-service", + ReactiveLoadBalancer.class, ServiceInstance.class); + + then(reactiveLoadBalancer).isInstanceOf(RoundRobinLoadBalancer.class); + then(reactiveLoadBalancer).isInstanceOf(ReactorLoadBalancer.class); + ReactorLoadBalancer loadBalancer = (ReactorLoadBalancer) reactiveLoadBalancer; + + for (int k = 0; k < 10; k++) { + booksClient.getBooks(); + } + + // order dependent on seedPosition -1 of RoundRobinLoadBalancer + List hosts = Arrays.asList("localhost", "localhost"); + + assertLoadBalancer(loadBalancer, hosts); + + mockBooksService.verify( + moreThan(0), getRequestedFor(WireMock.urlEqualTo("/books"))); + secondMockBooksService.verify( + moreThan(0), getRequestedFor(WireMock.urlEqualTo("/books"))); + } + + private void assertLoadBalancer(ReactorLoadBalancer loadBalancer, List hosts) { + for (String host : hosts) { + Mono> source = loadBalancer.choose(); + StepVerifier.create(source).consumeNextWith(response -> { + then(response).isNotNull(); + then(response.hasServer()).isTrue(); + + ServiceInstance instance = response.getServer(); + then(instance).isNotNull(); + then(instance.getHost()).as("instance host is incorrect %s", host).isEqualTo(host); + + if (host.contains("secure")) { + then(instance.isSecure()).isTrue(); + } + else { + then(instance.isSecure()).isFalse(); + } + }).verifyComplete(); + } + } } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java new file mode 100644 index 0000000000..eee4e7b860 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java @@ -0,0 +1,112 @@ +package com.baeldung.spring.cloud.client; + +import static org.assertj.core.api.BDDAssertions.then; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; +import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; +import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.github.tomakehurst.wiremock.WireMockServer; + +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +@SpringBootTest +@EnableFeignClients +@EnableConfigurationProperties +@ExtendWith(SpringExtension.class) +@ActiveProfiles("test") +@ContextConfiguration(classes = { TestConfig.class }) +class LoadBalancerIntegrationTest { + + @Autowired + private LoadBalancerClientFactory clientFactory; + + @Autowired + private BooksClient booksClient; + + @Autowired + private WireMockServer mockBooksService; + + @Autowired + private WireMockServer secondMockBooksService; + + private void assertLoadBalancer(ReactorLoadBalancer loadBalancer, List hosts) { + for (String host : hosts) { + Mono> source = loadBalancer.choose(); + StepVerifier.create(source).consumeNextWith(response -> { + then(response).isNotNull(); + then(response.hasServer()).isTrue(); + + ServiceInstance instance = response.getServer(); + then(instance).isNotNull(); + then(instance.getHost()).as("instance host is incorrect %s", host).isEqualTo(host); + + if (host.contains("secure")) { + then(instance.isSecure()).isTrue(); + } + else { + then(instance.isSecure()).isFalse(); + } + }).verifyComplete(); + } + } + + @Test + void staticConfigurationWorks() { + String serviceId = "test-book-service"; + RoundRobinLoadBalancer loadBalancer = new RoundRobinLoadBalancer(ServiceInstanceListSuppliers + .toProvider(serviceId, instance(serviceId, "bookservice1", false), instance(serviceId, "bookservice2", false)), + serviceId, -1); + assertLoadBalancer(loadBalancer, Arrays.asList("bookservice1", "bookservice2")); + } + + private static DefaultServiceInstance instance(String serviceId, String host, boolean secure) { + return new DefaultServiceInstance(serviceId, serviceId, host, 80, secure); + } + + @EnableAutoConfiguration + @SpringBootConfiguration(proxyBeanMethods = false) + @LoadBalancerClients({ @LoadBalancerClient(name = "books-service", configuration = MyBooksServiceConfig.class) }) + @EnableCaching + protected static class Config { + + } + + protected static class MyBooksServiceConfig { + + @Bean + public RoundRobinLoadBalancer roundRobinContextLoadBalancer(LoadBalancerClientFactory clientFactory, + Environment env) { + String serviceId = LoadBalancerClientFactory.getName(env); + return new RoundRobinLoadBalancer( + clientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId, -1); + } + + } + +} \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/RibbonTestConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/RibbonTestConfig.java deleted file mode 100644 index 273ba182b1..0000000000 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/RibbonTestConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.spring.cloud.client; - -import com.github.tomakehurst.wiremock.WireMockServer; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.cloud.netflix.ribbon.StaticServerList; -import org.springframework.context.annotation.Bean; -import org.springframework.test.context.ActiveProfiles; - -import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; - -@TestConfiguration -@ActiveProfiles("ribbon-test") -public class RibbonTestConfig { - - @Autowired - private WireMockServer mockBooksService; - - @Autowired - private WireMockServer secondMockBooksService; - - @Bean(initMethod = "start", destroyMethod = "stop") - public WireMockServer mockBooksService() { - return new WireMockServer(options().dynamicPort()); - } - - @Bean(name="secondMockBooksService", initMethod = "start", destroyMethod = "stop") - public WireMockServer secondBooksMockService() { - return new WireMockServer(options().dynamicPort()); - } - - @Bean - public ServerList ribbonServerList() { - return new StaticServerList<>( - new Server("localhost", mockBooksService.port()), - new Server("localhost", secondMockBooksService.port())); - } - -} diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java new file mode 100644 index 0000000000..b3770721b1 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.cloud.client; + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.ActiveProfiles; + +import com.github.tomakehurst.wiremock.WireMockServer; + +@TestConfiguration +@ActiveProfiles("test") +public class TestConfig { + + @Bean(initMethod = "start", destroyMethod = "stop") + public WireMockServer mockBooksService() { + return new WireMockServer(options().port(80)); + } + + @Bean(name="secondMockBooksService", initMethod = "start", destroyMethod = "stop") + public WireMockServer secondBooksMockService() { + return new WireMockServer(options().port(81)); + } +} diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java index 82b7cddede..3d4f2822f4 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java @@ -11,7 +11,11 @@ public class WireMockConfig { @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockBooksService() { - return new WireMockServer(9561); + return new WireMockServer(80); } + @Bean(initMethod = "start", destroyMethod = "stop") + public WireMockServer mockBooksService2() { + return new WireMockServer(81); + } } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-ribbon-test.yml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-ribbon-test.yml deleted file mode 100644 index 84a78d0ec7..0000000000 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-ribbon-test.yml +++ /dev/null @@ -1,3 +0,0 @@ -eureka: - client: - enabled: false diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml new file mode 100644 index 0000000000..ad11d46ae8 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml @@ -0,0 +1,19 @@ +eureka: + client: + enabled: false + +spring: + application: + name: books-service + cloud: + loadbalancer: + ribbon: + enabled: false + discovery: + client: + simple: + instances: + books-service[0]: + uri: http://localhost:80 + books-service[1]: + uri: http://localhost:81 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml index dce11adf69..231d45004f 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml @@ -1,11 +1,19 @@ -#book: -# service: -# url: http://localhost:9561 - -books-service: - ribbon: - listOfServers: http://localhost:9561 - eureka: client: enabled: false + +spring: + application: + name: books-service + cloud: + loadbalancer: + ribbon: + enabled: false + discovery: + client: + simple: + instances: + books-service[0]: + uri: http://localhost:80 + books-service[1]: + uri: http://localhost:81 From ff826f0d08c4f10fec597eb3cdf695e3b5682118 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 13 Oct 2023 14:31:01 +0300 Subject: [PATCH 081/831] JAVA-25519 Upgrade spring-boot-persistence to Spring Boot 3 (#14895) --- .../spring-boot-persistence/pom.xml | 15 +++++++++------ .../com/baeldung/boot/config/H2JpaConfig.java | 2 +- .../main/java/com/baeldung/boot/domain/Car.java | 6 +++--- .../java/com/baeldung/boot/domain/Country.java | 10 +++++----- .../java/com/baeldung/boot/domain/Employee.java | 8 ++++---- .../com/baeldung/boot/domain/GenericEntity.java | 8 ++++---- .../main/java/com/baeldung/boot/domain/User.java | 8 ++++---- .../com/baeldung/boot/naming/entity/Account.java | 8 ++++---- .../baeldung/boot/naming/entity/Preference.java | 6 +++--- .../com/baeldung/dataloading/model/Country.java | 10 +++++----- .../application/controllers/UserController.java | 2 +- .../application/entities/User.java | 10 +++++----- .../application/entities/User.java | 10 +++++----- .../application/models/Book.java | 6 +++--- .../LegacyJpaImplNamingIntegrationTest.java | 6 +++--- .../SpringBootDefaultNamingIntegrationTest.java | 4 ---- .../StrategyLegacyHbmImplIntegrationTest.java | 3 +-- .../baeldung/config/H2TestProfileJPAConfig.java | 2 +- 18 files changed, 61 insertions(+), 63 deletions(-) diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 58b4dd8b9e..3c77386ddd 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -49,10 +49,7 @@ mysql mysql-connector-java - - - javax.validation - validation-api + ${mysql-connector-java.version} org.xerial @@ -66,11 +63,17 @@ org.hsqldb hsqldb + + jakarta.validation + jakarta.validation-api + 2.23.0 2.0.1.Final + 8.0.31 + com.baeldung.boot.Application \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java index d3a09c08ff..96cb9ae975 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java @@ -13,7 +13,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Car.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Car.java index 736c12fb07..ba75269c29 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Car.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Car.java @@ -1,8 +1,8 @@ package com.baeldung.boot.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; /** * @author paullatzelsperger diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Country.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Country.java index 59227f6412..fcea52221f 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Country.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Country.java @@ -1,11 +1,11 @@ package com.baeldung.boot.domain; -import static javax.persistence.GenerationType.IDENTITY; +import static jakarta.persistence.GenerationType.IDENTITY; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Country { diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Employee.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Employee.java index 07e69a6f62..cef959fbfd 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Employee.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/Employee.java @@ -1,9 +1,9 @@ package com.baeldung.boot.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; /** * @author harshavs diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java index a2a676200a..ba38aadeef 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java @@ -1,9 +1,9 @@ package com.baeldung.boot.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class GenericEntity { diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/User.java index bdbe75cd0c..a5a6fb0160 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/User.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/User.java @@ -1,9 +1,9 @@ package com.baeldung.boot.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "users") diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Account.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Account.java index 00e90a5ec9..cef2241cdd 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Account.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Account.java @@ -1,9 +1,9 @@ package com.baeldung.boot.naming.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import java.util.List; @Entity diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Preference.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Preference.java index 7711156864..3bbe0069a8 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Preference.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/naming/entity/Preference.java @@ -1,8 +1,8 @@ package com.baeldung.boot.naming.entity; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; @Entity public class Preference { diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java index 692d48caf0..db5b242e69 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/dataloading/model/Country.java @@ -1,11 +1,11 @@ package com.baeldung.dataloading.model; -import static javax.persistence.GenerationType.IDENTITY; +import static jakarta.persistence.GenerationType.IDENTITY; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Country { diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/controllers/UserController.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/controllers/UserController.java index c55f1083ba..afc548f700 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/controllers/UserController.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/controllers/UserController.java @@ -2,7 +2,7 @@ package com.baeldung.springbootcrudapp.application.controllers; import com.baeldung.springbootcrudapp.application.repositories.UserRepository; import com.baeldung.springbootcrudapp.application.entities.User; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/entities/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/entities/User.java index 145f251158..4120c505a6 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/entities/User.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootcrudapp/application/entities/User.java @@ -1,10 +1,10 @@ package com.baeldung.springbootcrudapp.application.entities; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.validation.constraints.NotBlank; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotBlank; @Entity public class User { diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java index 84a9ae74ff..e35879fdd2 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springbootdatasourceconfig/application/entities/User.java @@ -1,10 +1,10 @@ package com.baeldung.springbootdatasourceconfig.application.entities; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "users") diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothibernate/application/models/Book.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothibernate/application/models/Book.java index 7562c072c7..5afc55a09b 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothibernate/application/models/Book.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothibernate/application/models/Book.java @@ -1,8 +1,8 @@ package com.baeldung.springboothibernate.application.models; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Book { diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/LegacyJpaImplNamingIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/LegacyJpaImplNamingIntegrationTest.java index 2feee10980..2922bb9167 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/LegacyJpaImplNamingIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/LegacyJpaImplNamingIntegrationTest.java @@ -35,13 +35,13 @@ public class LegacyJpaImplNamingIntegrationTest extends NamingConfig { String tableNameCreated = table.getName(); boolean columnNameIsQuoted = table - .getColumn(3) + .getColumn(2) .isQuoted(); String physicalNameCreated = table - .getColumn(3) + .getColumn(2) .getName(); String implicitNameCreated = table - .getColumn(2) + .getColumn(3) .getName(); SoftAssertions.assertSoftly(softly -> { diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/SpringBootDefaultNamingIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/SpringBootDefaultNamingIntegrationTest.java index c5c320f70c..4fb13a1798 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/SpringBootDefaultNamingIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/SpringBootDefaultNamingIntegrationTest.java @@ -16,10 +16,6 @@ import com.baeldung.boot.naming.entity.Account; @RunWith(SpringRunner.class) @DataJpaTest -@TestPropertySource(properties = { - "spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy", - "spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" -}) @Import(Config.class) public class SpringBootDefaultNamingIntegrationTest extends NamingConfig { diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/StrategyLegacyHbmImplIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/StrategyLegacyHbmImplIntegrationTest.java index ef978e5a98..8269e6c34a 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/StrategyLegacyHbmImplIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/boot/naming/StrategyLegacyHbmImplIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.boot.naming; -import com.baeldung.boot.naming.MetadataExtractorIntegrator; import com.baeldung.boot.naming.NamingConfig.Config; import com.baeldung.boot.naming.entity.Preference; @@ -47,7 +46,7 @@ public class StrategyLegacyHbmImplIntegrationTest extends NamingConfig { String implicitNameExpected = "account"; String implicitNameCreated = preferenceTable - .getColumn(3) + .getColumn(1) .getName(); String tableNameCreated = accountPreferencesTable.getName(); diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java index 515350fe0a..2a90f36a7c 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java @@ -12,7 +12,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; From ee98df03f40a2a963da092f37ef3c9e019322ac4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 13 Oct 2023 14:41:35 +0300 Subject: [PATCH 082/831] [JAVA-12051] Moved code to core-java-streams-simple for ebook (#14889) --- core-java-modules/core-java-11-2/README.md | 1 - core-java-modules/core-java-16/README.md | 1 - .../core-java-streams-2/README.md | 3 - .../streams/Java8StreamApiUnitTest.java | 2 + .../core-java-streams-3/README.md | 4 +- .../core-java-streams-simple/README.md | 14 +++++ .../core-java-streams-simple/pom.xml | 52 +++++++++++++++++ .../com/baeldung/streams/filter/Customer.java | 56 +++++++++++++++++++ .../streams}/groupingby/BlogPost.java | 2 +- .../streams}/groupingby/BlogPostType.java | 2 +- .../baeldung/streams}/groupingby/Tuple.java | 2 +- .../streams/parallel/BenchmarkRunner.java | 0 .../parallel/DifferentSourceSplitting.java | 0 .../streams/parallel/FileSearchCost.java | 0 .../streams/parallel/MemoryLocalityCosts.java | 0 .../streams/parallel/MergingCosts.java | 0 .../streams/parallel/ParallelStream.java | 0 .../streams/parallel/SequentialStream.java | 0 .../streams/parallel/SplittingCosts.java | 0 .../reduce/application/Application.java | 7 +-- .../benchmarks/JMHStreamReduceBenchMark.java | 4 +- .../streams}/reduce/entities/Rating.java | 2 +- .../streams}/reduce/entities/Review.java | 2 +- .../streams}/reduce/entities/User.java | 2 +- .../reduce/utilities/NumberUtils.java | 2 +- .../src/main/resources/logback.xml | 13 +++++ .../java/com/baeldung/streams/Detail.java | 0 .../streams/Java8StreamsUnitTest.java | 0 .../collectors/Java8CollectorsUnitTest.java | 2 +- .../streams}/filter/StreamFilterUnitTest.java | 14 ++--- .../map/Java8MapAndFlatMapUnitTest.java | 15 ++--- .../JavaGroupingByCollectorUnitTest.java | 28 +++++----- .../streams/map}/StreamMapUnitTest.java | 2 +- .../streams/parallel/ForkJoinUnitTest.java | 0 .../streams}/reduce/StreamReduceUnitTest.java | 35 ++++++------ core-java-modules/core-java-streams/README.md | 1 - core-java-modules/core-java-streams/pom.xml | 7 --- core-java-modules/pom.xml | 1 + 38 files changed, 200 insertions(+), 76 deletions(-) create mode 100644 core-java-modules/core-java-streams-simple/README.md create mode 100644 core-java-modules/core-java-streams-simple/pom.xml create mode 100644 core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/filter/Customer.java rename core-java-modules/{core-java-16/src/main/java/com/baeldung/java_16_features => core-java-streams-simple/src/main/java/com/baeldung/streams}/groupingby/BlogPost.java (95%) rename core-java-modules/{core-java-16/src/main/java/com/baeldung/java_16_features => core-java-streams-simple/src/main/java/com/baeldung/streams}/groupingby/BlogPostType.java (51%) rename core-java-modules/{core-java-16/src/main/java/com/baeldung/java_16_features => core-java-streams-simple/src/main/java/com/baeldung/streams}/groupingby/Tuple.java (94%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/MergingCosts.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/ParallelStream.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/SequentialStream.java (100%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java (100%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/application/Application.java (90%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/benchmarks/JMHStreamReduceBenchMark.java (94%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/entities/Rating.java (95%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/entities/Review.java (90%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/entities/User.java (89%) rename core-java-modules/{core-java-streams-2/src/main/java/com/baeldung => core-java-streams-simple/src/main/java/com/baeldung/streams}/reduce/utilities/NumberUtils.java (97%) create mode 100644 core-java-modules/core-java-streams-simple/src/main/resources/logback.xml rename core-java-modules/{core-java-streams-2 => core-java-streams-simple}/src/test/java/com/baeldung/streams/Detail.java (100%) rename core-java-modules/{core-java-streams-2 => core-java-streams-simple}/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java (100%) rename core-java-modules/{core-java-11-2/src/test/java/com/baeldung => core-java-streams-simple/src/test/java/com/baeldung/streams}/collectors/Java8CollectorsUnitTest.java (99%) rename core-java-modules/{core-java-streams/src/test/java/com/baeldung/stream => core-java-streams-simple/src/test/java/com/baeldung/streams}/filter/StreamFilterUnitTest.java (92%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java (73%) rename core-java-modules/{core-java-16/src/test/java/com/baeldung/java_16_features => core-java-streams-simple/src/test/java/com/baeldung/streams}/groupingby/JavaGroupingByCollectorUnitTest.java (89%) rename core-java-modules/{core-java-streams-2/src/test/java/com/baeldung/streams => core-java-streams-simple/src/test/java/com/baeldung/streams/map}/StreamMapUnitTest.java (98%) rename core-java-modules/{core-java-streams-3 => core-java-streams-simple}/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java (100%) rename core-java-modules/{core-java-streams-2/src/test/java/com/baeldung => core-java-streams-simple/src/test/java/com/baeldung/streams}/reduce/StreamReduceUnitTest.java (67%) diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md index ab8331f41c..b9dc82bc7f 100644 --- a/core-java-modules/core-java-11-2/README.md +++ b/core-java-modules/core-java-11-2/README.md @@ -5,7 +5,6 @@ This module contains articles about Java 11 core features ### Relevant articles - [Guide To Java 8 Optional](https://www.baeldung.com/java-optional) - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) -- [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors) - [New Features in Java 11](https://www.baeldung.com/java-11-new-features) - [Getting the Java Version at Runtime](https://www.baeldung.com/get-java-version-runtime) - [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service) diff --git a/core-java-modules/core-java-16/README.md b/core-java-modules/core-java-16/README.md index 11b0fba8d3..a0392dcfed 100644 --- a/core-java-modules/core-java-16/README.md +++ b/core-java-modules/core-java-16/README.md @@ -4,5 +4,4 @@ - [Guide to mapMulti in Stream API](https://www.baeldung.com/java-mapmulti) - [Collecting Stream Elements into a List in Java](https://www.baeldung.com/java-stream-to-list-collecting) - [New Features in Java 16](https://www.baeldung.com/java-16-new-features) -- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector) - [Value-Based Classes in Java](https://www.baeldung.com/java-value-based-classes) diff --git a/core-java-modules/core-java-streams-2/README.md b/core-java-modules/core-java-streams-2/README.md index 2ff95045c3..2de80ebc67 100644 --- a/core-java-modules/core-java-streams-2/README.md +++ b/core-java-modules/core-java-streams-2/README.md @@ -4,12 +4,9 @@ This module contains articles about the Stream API in Java. ### Relevant Articles: - [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams) -- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction) - [Java 8 Stream findFirst() vs. findAny()](https://www.baeldung.com/java-stream-findfirst-vs-findany) -- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce) - [Java IntStream Conversions](https://www.baeldung.com/java-intstream-convert) - [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api) -- [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams) - [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection) - [How to Add a Single Element to a Stream](https://www.baeldung.com/java-stream-append-prepend) - [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream) diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java index c4e1f2b3cb..53978f04b5 100644 --- a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java +++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.streams; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +38,7 @@ public class Java8StreamApiUnitTest { assertEquals(list.size() - 1, size); } + @Ignore @Test public void checkOrder_whenChangeQuantityOfMethodCalls_thenCorrect() { diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md index 48ebf145d2..70d9e68a5e 100644 --- a/core-java-modules/core-java-streams-3/README.md +++ b/core-java-modules/core-java-streams-3/README.md @@ -2,8 +2,7 @@ This module contains articles about the Stream API in Java. -### Relevant Articles: -- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap) +### Relevant Articles: - [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic) - [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach) - [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams) @@ -12,5 +11,4 @@ This module contains articles about the Stream API in Java. - [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close) - [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection) - [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream) -- [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream) - More articles: [[<-- prev>]](/../core-java-streams-2) diff --git a/core-java-modules/core-java-streams-simple/README.md b/core-java-modules/core-java-streams-simple/README.md new file mode 100644 index 0000000000..94d74f4c49 --- /dev/null +++ b/core-java-modules/core-java-streams-simple/README.md @@ -0,0 +1,14 @@ +## Java Streams Ebook + +This module contains articles about Streams that are part of the Java Streams Ebook. + +### Relevant Articles + +- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction) +- [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors) +- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda) +- [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams) +- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap) +- [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream) +- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector) +- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce) \ No newline at end of file diff --git a/core-java-modules/core-java-streams-simple/pom.xml b/core-java-modules/core-java-streams-simple/pom.xml new file mode 100644 index 0000000000..5910e9daf2 --- /dev/null +++ b/core-java-modules/core-java-streams-simple/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + core-java-streams-simple + core-java-streams-simple + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + com.pivovarit + throwing-function + ${throwing-function.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + core-java-streams-simple + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + 1.5.1 + 17 + 17 + 17 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/filter/Customer.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/filter/Customer.java new file mode 100644 index 0000000000..51756c0067 --- /dev/null +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/filter/Customer.java @@ -0,0 +1,56 @@ +package com.baeldung.streams.filter; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +import javax.net.ssl.HttpsURLConnection; + +public class Customer { + private String name; + private int points; + private String profilePhotoUrl; + + public Customer(String name, int points) { + this(name, points, ""); + } + + public Customer(String name, int points, String profilePhotoUrl) { + this.name = name; + this.points = points; + this.profilePhotoUrl = profilePhotoUrl; + } + + public String getName() { + return name; + } + + public int getPoints() { + return points; + } + + public boolean hasOver(int points) { + return this.points > points; + } + + public boolean hasOverHundredPoints() { + return this.points > 100; + } + + public boolean hasValidProfilePhoto() throws IOException { + URL url = new URL(this.profilePhotoUrl); + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + return connection.getResponseCode() == HttpURLConnection.HTTP_OK; + } + + public boolean hasValidProfilePhotoWithoutCheckedException() { + try { + URL url = new URL(this.profilePhotoUrl); + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + return connection.getResponseCode() == HttpURLConnection.HTTP_OK; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} 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-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPost.java similarity index 95% rename from core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPost.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPost.java index 314fbeeeb5..f22a20e67f 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-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPost.java @@ -1,4 +1,4 @@ -package com.baeldung.java_16_features.groupingby; +package com.baeldung.streams.groupingby; import java.util.IntSummaryStatistics; diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPostType.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPostType.java similarity index 51% rename from core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPostType.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPostType.java index df38b7e1c4..9bc5d95422 100644 --- a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/BlogPostType.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/BlogPostType.java @@ -1,4 +1,4 @@ -package com.baeldung.java_16_features.groupingby; +package com.baeldung.streams.groupingby; public enum BlogPostType { NEWS, REVIEW, GUIDE diff --git a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/Tuple.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/Tuple.java similarity index 94% rename from core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/Tuple.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/Tuple.java index ad41207aa4..e57a9190ec 100644 --- a/core-java-modules/core-java-16/src/main/java/com/baeldung/java_16_features/groupingby/Tuple.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/groupingby/Tuple.java @@ -1,4 +1,4 @@ -package com.baeldung.java_16_features.groupingby; +package com.baeldung.streams.groupingby; import java.util.Objects; diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java 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-simple/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/FileSearchCost.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/MergingCosts.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/MergingCosts.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/ParallelStream.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/ParallelStream.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/SequentialStream.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/SequentialStream.java diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/application/Application.java similarity index 90% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/application/Application.java index 62d080c32c..2ea91edddd 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/application/Application.java @@ -1,8 +1,7 @@ -package com.baeldung.reduce.application; +package com.baeldung.streams.reduce.application; + +import com.baeldung.streams.reduce.entities.User; -import com.baeldung.reduce.entities.User; -import com.baeldung.reduce.utilities.NumberUtils; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/benchmarks/JMHStreamReduceBenchMark.java similarity index 94% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/benchmarks/JMHStreamReduceBenchMark.java index ecb0347e96..3c11643bce 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/benchmarks/JMHStreamReduceBenchMark.java @@ -1,6 +1,6 @@ -package com.baeldung.reduce.benchmarks; +package com.baeldung.streams.reduce.benchmarks; -import com.baeldung.reduce.entities.User; +import com.baeldung.streams.reduce.entities.User; import java.util.ArrayList; import java.util.List; import org.openjdk.jmh.annotations.Benchmark; diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Rating.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Rating.java similarity index 95% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Rating.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Rating.java index 566691d442..400322c9ce 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Rating.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Rating.java @@ -1,4 +1,4 @@ -package com.baeldung.reduce.entities; +package com.baeldung.streams.reduce.entities; import java.util.ArrayList; import java.util.List; diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Review.java similarity index 90% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Review.java index b889a5f154..6d623127cf 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/Review.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/Review.java @@ -1,4 +1,4 @@ -package com.baeldung.reduce.entities; +package com.baeldung.streams.reduce.entities; public class Review { diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java similarity index 89% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java index 6e0a529de6..610bd93b22 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java @@ -1,4 +1,4 @@ -package com.baeldung.reduce.entities; +package com.baeldung.streams.reduce.entities; public class User { diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/utilities/NumberUtils.java similarity index 97% rename from core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java rename to core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/utilities/NumberUtils.java index 38d5b50120..ed77bfe635 100644 --- a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/utilities/NumberUtils.java @@ -1,4 +1,4 @@ -package com.baeldung.reduce.utilities; +package com.baeldung.streams.reduce.utilities; import java.util.List; import java.util.function.BiFunction; diff --git a/core-java-modules/core-java-streams-simple/src/main/resources/logback.xml b/core-java-modules/core-java-streams-simple/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-streams-simple/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Detail.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Detail.java similarity index 100% rename from core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Detail.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Detail.java diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java similarity index 100% rename from core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java similarity index 99% rename from core-java-modules/core-java-11-2/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java index 7990b1fdb7..085c1b5d7f 100644 --- a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.collectors; +package com.baeldung.streams.collectors; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; diff --git a/core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/filter/StreamFilterUnitTest.java similarity index 92% rename from core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/filter/StreamFilterUnitTest.java index 3f3922e015..be7162217f 100644 --- a/core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/filter/StreamFilterUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stream.filter; +package com.baeldung.streams.filter; import org.junit.jupiter.api.Test; import com.pivovarit.function.ThrowingPredicate; @@ -14,10 +14,10 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -public class StreamFilterUnitTest { +class StreamFilterUnitTest { @Test - public void givenListOfCustomers_whenFilterByPoints_thenGetTwo() { + void givenListOfCustomers_whenFilterByPoints_thenGetTwo() { Customer john = new Customer("John P.", 15); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); @@ -53,7 +53,7 @@ public class StreamFilterUnitTest { } @Test - public void givenListOfCustomers_whenFilterByMethodReference_thenGetTwo() { + void givenListOfCustomers_whenFilterByMethodReference_thenGetTwo() { Customer john = new Customer("John P.", 15); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); @@ -70,7 +70,7 @@ public class StreamFilterUnitTest { } @Test - public void givenListOfCustomersWithOptional_whenFilterBy100Points_thenGetTwo() { + void givenListOfCustomersWithOptional_whenFilterBy100Points_thenGetTwo() { Optional john = Optional.of(new Customer("John P.", 15)); Optional sarah = Optional.of(new Customer("Sarah M.", 200)); Optional mary = Optional.of(new Customer("Mary T.", 300)); @@ -89,7 +89,7 @@ public class StreamFilterUnitTest { } @Test - public void givenListOfCustomers_whenFilterWithCustomHandling_thenThrowException() { + void givenListOfCustomers_whenFilterWithCustomHandling_thenThrowException() { Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); @@ -103,7 +103,7 @@ public class StreamFilterUnitTest { } @Test - public void givenListOfCustomers_whenFilterWithThrowingFunction_thenThrowException() { + void givenListOfCustomers_whenFilterWithThrowingFunction_thenThrowException() { Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java similarity index 73% rename from core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java index 1b09ea25c6..6de0f73351 100644 --- a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/flatmap/map/Java8MapAndFlatMapUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.streams.flatmap.map; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collection; @@ -10,12 +11,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; -public class Java8MapAndFlatMapUnitTest { + +class Java8MapAndFlatMapUnitTest { @Test - public void givenStream_whenCalledMap_thenProduceList() { + void givenStream_whenCalledMap_thenProduceList() { List myList = Stream.of("a", "b") .map(String::toUpperCase) .collect(Collectors.toList()); @@ -23,7 +24,7 @@ public class Java8MapAndFlatMapUnitTest { } @Test - public void givenStream_whenCalledFlatMap_thenProduceFlattenedList() throws Exception { + void givenStream_whenCalledFlatMap_thenProduceFlattenedList() { List> list = Arrays.asList(Arrays.asList("a"), Arrays.asList("b")); System.out.println(list); @@ -33,13 +34,13 @@ public class Java8MapAndFlatMapUnitTest { } @Test - public void givenOptional_whenCalledMap_thenProduceOptional() { + void givenOptional_whenCalledMap_thenProduceOptional() { Optional s = Optional.of("test"); assertEquals(Optional.of("TEST"), s.map(String::toUpperCase)); } @Test - public void givenOptional_whenCalledFlatMap_thenProduceFlattenedOptional() { + void givenOptional_whenCalledFlatMap_thenProduceFlattenedOptional() { assertEquals(Optional.of(Optional.of("STRING")), Optional.of("string") .map(s -> Optional.of("STRING"))); 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-streams-simple/src/test/java/com/baeldung/streams/groupingby/JavaGroupingByCollectorUnitTest.java similarity index 89% rename from core-java-modules/core-java-16/src/test/java/com/baeldung/java_16_features/groupingby/JavaGroupingByCollectorUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/groupingby/JavaGroupingByCollectorUnitTest.java index 603bebb7c5..be5d176c50 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-streams-simple/src/test/java/com/baeldung/streams/groupingby/JavaGroupingByCollectorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java_16_features.groupingby; +package com.baeldung.streams.groupingby; import static java.util.Comparator.comparingInt; import static java.util.stream.Collectors.averagingInt; @@ -33,13 +33,13 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; -public class JavaGroupingByCollectorUnitTest { +class JavaGroupingByCollectorUnitTest { private static final List posts = Arrays.asList(new BlogPost("News item 1", "Author 1", BlogPostType.NEWS, 15), new BlogPost("Tech review 1", "Author 2", BlogPostType.REVIEW, 5), new BlogPost("Programming guide", "Author 1", BlogPostType.GUIDE, 20), new BlogPost("News item 2", "Author 2", BlogPostType.NEWS, 35), new BlogPost("Tech review 2", "Author 1", BlogPostType.REVIEW, 15)); @Test - public void givenAListOfPosts_whenGroupedByType_thenGetAMapBetweenTypeAndPosts() { + void givenAListOfPosts_whenGroupedByType_thenGetAMapBetweenTypeAndPosts() { Map> postsPerType = posts.stream() .collect(groupingBy(BlogPost::getType)); @@ -52,7 +52,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndTheirTitlesAreJoinedInAString_thenGetAMapBetweenTypeAndCsvTitles() { + void givenAListOfPosts_whenGroupedByTypeAndTheirTitlesAreJoinedInAString_thenGetAMapBetweenTypeAndCsvTitles() { Map postsPerType = posts.stream() .collect(groupingBy(BlogPost::getType, mapping(BlogPost::getTitle, joining(", ", "Post titles: [", "]")))); @@ -62,7 +62,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndSumTheLikes_thenGetAMapBetweenTypeAndPostLikes() { + void givenAListOfPosts_whenGroupedByTypeAndSumTheLikes_thenGetAMapBetweenTypeAndPostLikes() { Map likesPerType = posts.stream() .collect(groupingBy(BlogPost::getType, summingInt(BlogPost::getLikes))); @@ -75,7 +75,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeInAnEnumMap_thenGetAnEnumMapBetweenTypeAndPosts() { + void givenAListOfPosts_whenGroupedByTypeInAnEnumMap_thenGetAnEnumMapBetweenTypeAndPosts() { EnumMap> postsPerType = posts.stream() .collect(groupingBy(BlogPost::getType, () -> new EnumMap<>(BlogPostType.class), toList())); @@ -88,7 +88,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeInSets_thenGetAMapBetweenTypesAndSetsOfPosts() { + void givenAListOfPosts_whenGroupedByTypeInSets_thenGetAMapBetweenTypesAndSetsOfPosts() { Map> postsPerType = posts.stream() .collect(groupingBy(BlogPost::getType, toSet())); @@ -101,7 +101,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeConcurrently_thenGetAMapBetweenTypeAndPosts() { + void givenAListOfPosts_whenGroupedByTypeConcurrently_thenGetAMapBetweenTypeAndPosts() { ConcurrentMap> postsPerType = posts.parallelStream() .collect(groupingByConcurrent(BlogPost::getType)); @@ -114,7 +114,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndAveragingLikes_thenGetAMapBetweenTypeAndAverageNumberOfLikes() { + void givenAListOfPosts_whenGroupedByTypeAndAveragingLikes_thenGetAMapBetweenTypeAndAverageNumberOfLikes() { Map averageLikesPerType = posts.stream() .collect(groupingBy(BlogPost::getType, averagingInt(BlogPost::getLikes))); @@ -127,7 +127,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndCounted_thenGetAMapBetweenTypeAndNumberOfPosts() { + void givenAListOfPosts_whenGroupedByTypeAndCounted_thenGetAMapBetweenTypeAndNumberOfPosts() { Map numberOfPostsPerType = posts.stream() .collect(groupingBy(BlogPost::getType, counting())); @@ -140,7 +140,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndMaxingLikes_thenGetAMapBetweenTypeAndMaximumNumberOfLikes() { + void givenAListOfPosts_whenGroupedByTypeAndMaxingLikes_thenGetAMapBetweenTypeAndMaximumNumberOfLikes() { Map> maxLikesPerPostType = posts.stream() .collect(groupingBy(BlogPost::getType, maxBy(comparingInt(BlogPost::getLikes)))); @@ -164,7 +164,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByAuthorAndThenByType_thenGetAMapBetweenAuthorAndMapsBetweenTypeAndBlogPosts() { + void givenAListOfPosts_whenGroupedByAuthorAndThenByType_thenGetAMapBetweenAuthorAndMapsBetweenTypeAndBlogPosts() { Map>> map = posts.stream() .collect(groupingBy(BlogPost::getAuthor, groupingBy(BlogPost::getType))); @@ -189,7 +189,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { + void givenAListOfPosts_whenGroupedByTypeAndSummarizingLikes_thenGetAMapBetweenTypeAndSummary() { Map likeStatisticsPerType = posts.stream() .collect(groupingBy(BlogPost::getType, summarizingInt(BlogPost::getLikes))); @@ -203,7 +203,7 @@ public class JavaGroupingByCollectorUnitTest { } @Test - public void givenAListOfPosts_whenGroupedByComplexMapPairKeyType_thenGetAMapBetweenPairAndList() { + void givenAListOfPosts_whenGroupedByComplexMapPairKeyType_thenGetAMapBetweenPairAndList() { Map, List> postsPerTypeAndAuthor = posts.stream() .collect(groupingBy(post -> new ImmutablePair<>(post.getType(), post.getAuthor()))); diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/map/StreamMapUnitTest.java similarity index 98% rename from core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/map/StreamMapUnitTest.java index 509a3a3569..c493ed903d 100644 --- a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/map/StreamMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.streams; +package com.baeldung.streams.map; import org.junit.Before; import org.junit.Test; diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java similarity index 100% rename from core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceUnitTest.java similarity index 67% rename from core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceUnitTest.java index 21eedf953e..009dd2ee37 100644 --- a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceUnitTest.java @@ -1,79 +1,80 @@ -package com.baeldung.reduce; +package com.baeldung.streams.reduce; -import com.baeldung.reduce.entities.User; -import com.baeldung.reduce.utilities.NumberUtils; -import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + +import com.baeldung.streams.reduce.entities.User; +import com.baeldung.streams.reduce.utilities.NumberUtils; + +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; - -public class StreamReduceUnitTest { +class StreamReduceUnitTest { @Test - public void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() { + void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int result = numbers.stream().reduce(0, (subtotal, element) -> subtotal + element); assertThat(result).isEqualTo(21); } @Test - public void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() { + void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int result = numbers.stream().reduce(0, Integer::sum); assertThat(result).isEqualTo(21); } @Test - public void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() { + void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() { List letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters.stream().reduce("", (partialString, element) -> partialString + element); assertThat(result).isEqualTo("abcde"); } @Test - public void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() { + void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() { List letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters.stream().reduce("", String::concat); assertThat(result).isEqualTo("abcde"); } @Test - public void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() { + void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() { List letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters.stream().reduce("", (partialString, element) -> partialString.toUpperCase() + element.toUpperCase()); assertThat(result).isEqualTo("ABCDE"); } @Test - public void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() { + void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() { List users = Arrays.asList(new User("John", 30), new User("Julie", 35)); int result = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); assertThat(result).isEqualTo(65); } @Test - public void givenStringList_whenReduceWithParallelStream_thenCorrect() { + void givenStringList_whenReduceWithParallelStream_thenCorrect() { List letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters.parallelStream().reduce("", String::concat); assertThat(result).isEqualTo("abcde"); } @Test - public void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() { + void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); assertThat(NumberUtils.divideListElements(numbers, 1)).isEqualTo(21); } @Test - public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() { + void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21); } @Test - public void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() { + void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); assertThat(NumberUtils.divideListElementsWithApplyFunctionMethod(numbers, 1)).isEqualTo(21); } diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md index 360f7190ea..adb4c1dda1 100644 --- a/core-java-modules/core-java-streams/README.md +++ b/core-java-modules/core-java-streams/README.md @@ -9,7 +9,6 @@ This module contains articles about the Stream API in Java. - [Iterable to Stream in Java](https://www.baeldung.com/java-iterable-to-stream) - [How to Iterate Over a Stream With Indices](https://www.baeldung.com/java-stream-indices) - [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering) -- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda) - [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count) - [Summing Numbers with Java Streams](https://www.baeldung.com/java-stream-sum) - [How to Find All Getters Returning Null](https://www.baeldung.com/java-getters-returning-null) diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml index c7282dda21..005968d214 100644 --- a/core-java-modules/core-java-streams/pom.xml +++ b/core-java-modules/core-java-streams/pom.xml @@ -29,11 +29,6 @@ streamex ${streamex.version} - - com.pivovarit - throwing-function - ${throwing-function.version} - @@ -62,8 +57,6 @@ 0.10.4 1.16 0.8.1 - 1.5.1 - 17 17 diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 5b5255daa1..5b37db6e1a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -166,6 +166,7 @@ core-java-security-algorithms core-java-serialization core-java-streams + core-java-streams-simple core-java-streams-3 core-java-string-algorithms core-java-string-algorithms-2 From 604c45b8f0b8f4b175df6f08a2eaf6b9faa1af9b Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 13 Oct 2023 12:06:18 +0000 Subject: [PATCH 083/831] Difference Between Information Hiding and Encapsulation (#14886) * Difference Between Information Hiding and Encapsulation * Difference Between Information Hiding and Encapsulation --- .../java/com/baeldung/encapsulation/Book.java | 7 ++++ .../baeldung/encapsulation/BookDetails.java | 8 +++++ .../encapsulation/BookEncapsulation.java | 17 +++++++++ .../encapsulation/BookInformationHiding.java | 36 +++++++++++++++++++ ...psulationAndInformationHidingUnitTest.java | 35 ++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/Book.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookDetails.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookEncapsulation.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookInformationHiding.java create mode 100644 core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/encapsulation/EncapsulationAndInformationHidingUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/Book.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/Book.java new file mode 100644 index 0000000000..73762758e5 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/Book.java @@ -0,0 +1,7 @@ +package com.baeldung.encapsulation; + +public class Book { + public String author; + public int isbn; + +} diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookDetails.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookDetails.java new file mode 100644 index 0000000000..9df45b1f14 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookDetails.java @@ -0,0 +1,8 @@ +package com.baeldung.encapsulation; + +public class BookDetails { + + public String bookDetails(Book book) { + return "author name: " + book.author + " ISBN: " + book.isbn; + } +} diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookEncapsulation.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookEncapsulation.java new file mode 100644 index 0000000000..c39ca4bab4 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookEncapsulation.java @@ -0,0 +1,17 @@ +package com.baeldung.encapsulation; + +public class BookEncapsulation { + public String author; + public int isbn; + public int id = 1; + + public BookEncapsulation(String author, int isbn) { + this.author = author; + this.isbn = isbn; + } + + public String getBookDetails() { + return "author id: " + id + " author name: " + author + " ISBN: " + isbn; + } + +} diff --git a/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookInformationHiding.java b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookInformationHiding.java new file mode 100644 index 0000000000..2d670a358d --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/main/java/com/baeldung/encapsulation/BookInformationHiding.java @@ -0,0 +1,36 @@ +package com.baeldung.encapsulation; + +public class BookInformationHiding { + private String author; + private int isbn; + private int id = 1; + + public BookInformationHiding(String author, int isbn) { + setAuthor(author); + setIsbn(isbn); + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public int getIsbn() { + return isbn; + } + + public void setIsbn(int isbn) { + if (isbn < 0) { + throw new IllegalArgumentException("ISBN can't be negative"); + } + this.isbn = isbn; + } + + public String getBookDetails() { + return "author id: " + id + " author name: " + author + " ISBN: " + isbn; + } + +} diff --git a/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/encapsulation/EncapsulationAndInformationHidingUnitTest.java b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/encapsulation/EncapsulationAndInformationHidingUnitTest.java new file mode 100644 index 0000000000..6106d1a406 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-others/src/test/java/com/baeldung/encapsulation/EncapsulationAndInformationHidingUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.encapsulation; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class EncapsulationAndInformationHidingUnitTest { + + @Test + public void givenUnencapsulatedClass_whenImplementationClassIsSeparate_thenReturnResult() { + Book myBook = new Book(); + myBook.author = "J.K Rowlings"; + myBook.isbn = 67890; + BookDetails details = new BookDetails(); + String result = details.bookDetails(myBook); + assertEquals("author name: " + myBook.author + " ISBN: " + myBook.isbn, result); + + } + + @Test + public void givenEncapsulatedClass_whenDataIsNotHidden_thenReturnResult() { + BookEncapsulation myBook = new BookEncapsulation("J.K Rowlings", 67890); + String result = myBook.getBookDetails(); + assertEquals("author id: " + 1 + " author name: " + myBook.author + " ISBN: " + myBook.isbn, result); + } + + @Test + public void givenEncapsulatedClass_whenDataIsHidden_thenReturnResult() { + BookInformationHiding myBook = new BookInformationHiding("J.K Rowlings", 67890); + String result = myBook.getBookDetails(); + assertEquals("author id: " + 1 + " author name: " + myBook.getAuthor() + " ISBN: " + myBook.getIsbn(), result); + } + +} From 268698089d3aade83af4f7ad6c98fc6b6851c784 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Fri, 13 Oct 2023 19:47:19 +0200 Subject: [PATCH 084/831] BAEL-6715: Taking Every Nth Element from a Java Stream (#14974) * BAEL-6715: Taking Every Nth Element from a Java Stream * BAEL-6715: Renaming the tests --- .../skippingelements/SkippingCollector.java | 32 +++++ .../skippingelements/SkippingElements.java | 65 ++++++++++ .../SkippingElementsUnitTest.java | 114 ++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java new file mode 100644 index 0000000000..8f36550bdc --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java @@ -0,0 +1,32 @@ +package com.baeldung.skippingelements; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.BinaryOperator; +import java.util.stream.Collector; + +class SkippingCollector { + private static final BinaryOperator IGNORE_COMBINE = (a, b) -> a; + private final int skip; + private final List list = new ArrayList<>(); + private int currentIndex = 0; + private SkippingCollector(int skip) { + this.skip = skip; + } + + private void accept(String item) { + final int index = ++currentIndex % skip; + if (index == 0) + list.add(item); + } + private List getResult() { + return list; + } + + public static Collector> collector(int skip) { + return Collector.of(() -> new SkippingCollector(skip), + SkippingCollector::accept, + IGNORE_COMBINE, + SkippingCollector::getResult); + } +} diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java new file mode 100644 index 0000000000..eb382367cc --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java @@ -0,0 +1,65 @@ +package com.baeldung.skippingelements; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class SkippingElements { + + private SkippingElements() { + } + + public static List skipNthElementInListWithFilter(List sourceList, int n) { +return IntStream.range(0, sourceList.size()) + .filter(s -> (s + 1) % n == 0) + .mapToObj(sourceList::get) + .collect(Collectors.toList()); + } + + public static List skipNthElementInListWithIterate(List sourceList, int n) { +int limit = sourceList.size() / n; +return IntStream.iterate(n - 1, i -> (i + n)) + .limit(limit) + .mapToObj(sourceList::get) + .collect(Collectors.toList()); + } + + public static List skipNthElementInListWithSublist(List sourceList, int n) { +int limit = sourceList.size() / n; +return Stream.iterate(sourceList, s -> s.subList(n, s.size())) + .limit(limit) + .map(s -> s.get(n - 1)) + .collect(Collectors.toList()); + } + + public static List skipNthElementInListWithFor(List sourceList, int n) { +List result = new ArrayList<>(); +for (int i = n - 1; i < sourceList.size(); i += n) { + result.add(sourceList.get(i)); +} +return result; + } + + public static List skipNthElementInListWithIterator(Stream sourceStream, int n) { +List result = new ArrayList<>(); +final Iterator iterator = sourceStream.iterator(); +int count = 0; +while (iterator.hasNext()) { + if (count % n == n - 1) { + result.add(iterator.next()); + } else { + iterator.next(); + } + ++count; +} +return result; + } + +public static List skipNthElementInStreamWithCollector(Stream sourceStream, int n) { + return sourceStream.collect(SkippingCollector.collector(n)); +} + +} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java new file mode 100644 index 0000000000..2fd6adb0cf --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java @@ -0,0 +1,114 @@ +package com.baeldung.skippingelements; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class SkippingElementsUnitTest { + + private static Stream testSource() { + return Stream.of( + Arguments.of( + List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", + "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", + "Thirty One", "Thirty Two", "Thirty Three"), + List.of("Three", "Six", "Nine", "Twelve", "Fifteen", "Eighteen", "Twenty One", "Twenty Four", "Twenty Seven", "Thirty", "Thirty Three"), + 3), + Arguments.of( + List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", + "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", + "Thirty One", "Thirty Two", "Thirty Three"), + List.of("Five", "Ten", "Fifteen", "Twenty", "Twenty Five", "Thirty"), + 5), + Arguments.of( + List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", + "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", + "Thirty One", "Thirty Two", "Thirty Three"), + List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", + "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", + "Thirty One", "Thirty Two", "Thirty Three"), + 1), + Arguments.of( + List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + List.of("Wednesday", "Saturday"), + 3), + Arguments.of( + List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + List.of("Friday"), + 5), + Arguments.of( + List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + 1), + Arguments.of( + List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + "December"), + List.of("March", "June", "September", "December"), + 3), + Arguments.of( + List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + "December"), + List.of("May", "October"), + 5), + Arguments.of( + List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + "December"), + List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + "December"), + 1) + ); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInListWithFilterTestShouldFilterNthElement(List input, List expected, int n) { + final List actual = SkippingElements.skipNthElementInListWithFilter(input, n); + assertEquals(expected, actual); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInListWithIterateTestShouldFilterNthElement(List input, List expected, int n) { + final List actual = SkippingElements.skipNthElementInListWithIterate(input, n); + assertEquals(expected, actual); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInListWithSublistTestShouldFilterNthElement(List input, List expected, int n) { + final List actual = SkippingElements.skipNthElementInListWithSublist(input, n); + assertEquals(expected, actual); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInListWithForTestShouldFilterNthElement(List input, List expected, int n) { + final List actual = SkippingElements.skipNthElementInListWithFor(input, n); + assertEquals(expected, actual); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInStreamWithIteratorTestShouldFilterNthElement(List input, List expected, int n) { + final Stream inputStream = input.stream(); + final List actual = SkippingElements.skipNthElementInListWithIterator(inputStream, n); + assertEquals(expected, actual); + } + + @ParameterizedTest + @MethodSource("testSource") + void givenListSkipNthElementInStreamWithCollectorShouldFilterNthElement(List input, List expected, int n) { + final Stream inputStream = input.stream(); + final List actual = SkippingElements.skipNthElementInStreamWithCollector(inputStream, n); + assertEquals(expected, actual); + } +} \ No newline at end of file From 34a5983784f0616d20cd67fc31844278877412f1 Mon Sep 17 00:00:00 2001 From: Alvin Austria Date: Fri, 13 Oct 2023 20:23:24 +0200 Subject: [PATCH 085/831] JAVA-23238 : Upgraded spring-cloud-security to JDK 17 --- pom.xml | 2 ++ spring-cloud-modules/pom.xml | 2 +- .../java/com/baeldung/filters/SimpleFilter.java | 8 +++++--- .../spring-cloud-security/auth-resource/pom.xml | 15 +++++++++++++++ .../spring-cloud-security/auth-server/pom.xml | 15 +++++++++++++++ .../spring-cloud-security/pom.xml | 3 +++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 5d8358f05e..8766f6ff4f 100644 --- a/pom.xml +++ b/pom.xml @@ -728,6 +728,7 @@ spring-cloud-modules/spring-cloud-data-flow spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign + spring-cloud-modules/spring-cloud-security spring-cloud-modules/spring-cloud-stream-starters spring-cloud-modules/spring-cloud-zuul-eureka-integration @@ -1011,6 +1012,7 @@ spring-cloud-modules/spring-cloud-data-flow spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-security spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-exceptions diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml index a098bc90a9..729dd8eaf1 100644 --- a/spring-cloud-modules/pom.xml +++ b/spring-cloud-modules/pom.xml @@ -39,7 +39,7 @@ spring-cloud-archaius spring-cloud-functions spring-cloud-vault - spring-cloud-security + spring-cloud-task spring-cloud-zuul spring-cloud-zuul-fallback diff --git a/spring-cloud-modules/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java b/spring-cloud-modules/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java index 98e25ac9c4..4204588428 100644 --- a/spring-cloud-modules/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java +++ b/spring-cloud-modules/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java @@ -1,12 +1,13 @@ package com.baeldung.filters; import javax.servlet.http.HttpServletRequest; -import com.netflix.zuul.context.RequestContext; -import com.netflix.zuul.ZuulFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; + public class SimpleFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(SimpleFilter.class); @@ -31,7 +32,8 @@ public class SimpleFilter extends ZuulFilter { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); - log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString())); + log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL() + .toString())); return null; } diff --git a/spring-cloud-modules/spring-cloud-security/auth-resource/pom.xml b/spring-cloud-modules/spring-cloud-security/auth-resource/pom.xml index 9362a71931..b4e29fce49 100644 --- a/spring-cloud-modules/spring-cloud-security/auth-resource/pom.xml +++ b/spring-cloud-modules/spring-cloud-security/auth-resource/pom.xml @@ -33,6 +33,21 @@ spring-security-jwt ${spring-jwt.version} + + com.sun.xml.bind + jaxb-core + ${jaxb-core.version} + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-impl.version} + diff --git a/spring-cloud-modules/spring-cloud-security/auth-server/pom.xml b/spring-cloud-modules/spring-cloud-security/auth-server/pom.xml index 234d9cde78..8c14b8fa74 100644 --- a/spring-cloud-modules/spring-cloud-security/auth-server/pom.xml +++ b/spring-cloud-modules/spring-cloud-security/auth-server/pom.xml @@ -35,6 +35,21 @@ org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure + + com.sun.xml.bind + jaxb-core + ${jaxb-core.version} + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb-impl.version} + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-security/pom.xml b/spring-cloud-modules/spring-cloud-security/pom.xml index ad6421384e..72d1d6cbfc 100644 --- a/spring-cloud-modules/spring-cloud-security/pom.xml +++ b/spring-cloud-modules/spring-cloud-security/pom.xml @@ -34,6 +34,9 @@ 2021.0.3 + 2.3.0.1 + 2.3.1 + 2.3.1 \ No newline at end of file From 24dcde3d6d9bb9f66257f14bac842789300e7151 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 14 Oct 2023 02:41:06 +0200 Subject: [PATCH 086/831] [join-str-comma-and] Joining Strings follows natural language grammar (#14941) --- .../JoinStringsAsNaturalLangUnitTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/joinasnl/JoinStringsAsNaturalLangUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/joinasnl/JoinStringsAsNaturalLangUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/joinasnl/JoinStringsAsNaturalLangUnitTest.java new file mode 100644 index 0000000000..f3ca5a3e2b --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/joinasnl/JoinStringsAsNaturalLangUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.joinasnl; + +import static java.util.Collections.emptyList; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class JoinStringsAsNaturalLangUnitTest { + String joinItemsAsNaturalLanguage(List list, boolean oxfordComma) { + if (list.size() < 3) { + return String.join(" and ", list); + } + // list has at least three elements + int lastIdx = list.size() - 1; + StringBuilder sb = new StringBuilder(); + return sb.append(String.join(", ", list.subList(0, lastIdx))) + .append(oxfordComma ? ", and " : " and ") + .append(list.get(lastIdx)) + .toString(); + } + + @Test + void whenCallingJoinByGrammar_thenGetTheExpectedResult() { + assertEquals("", joinItemsAsNaturalLanguage(emptyList(), false)); + assertEquals("A", joinItemsAsNaturalLanguage(List.of("A"), false)); + assertEquals("A and B", joinItemsAsNaturalLanguage(List.of("A", "B"), false)); + assertEquals("A, B, C, D and I have a comma (,)", joinItemsAsNaturalLanguage(List.of("A", "B", "C", "D", "I have a comma (,)"), false)); + // with oxford comma = true + assertEquals("", joinItemsAsNaturalLanguage(emptyList(), true)); + assertEquals("A", joinItemsAsNaturalLanguage(List.of("A"), true)); + assertEquals("A and B", joinItemsAsNaturalLanguage(List.of("A", "B"), true)); + assertEquals("A, B, C, D, and I have a comma (,)", joinItemsAsNaturalLanguage(List.of("A", "B", "C", "D", "I have a comma (,)"), true)); + } +} \ No newline at end of file From 06943519f841b3cb0fb3ef07348921e7528d0a02 Mon Sep 17 00:00:00 2001 From: "emanuel.trandafir" Date: Sat, 14 Oct 2023 13:06:31 +0200 Subject: [PATCH 087/831] BAEL-7001: retry RetryCompletableFuture --- .../retry/RetryCompletableFuture.java | 63 +++++++++ .../retry/RetryCompletableFutureUnitTest.java | 125 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java new file mode 100644 index 0000000000..41f1309311 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java @@ -0,0 +1,63 @@ +package com.baeldung.concurrent.completablefuture.retry; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.function.Supplier; + +public class RetryCompletableFuture { + public static CompletableFuture retryTask(Supplier supplier, int maxRetries) { + Supplier retryableSupplier = retryFunction(supplier, maxRetries); + return CompletableFuture.supplyAsync(retryableSupplier); + } + + static Supplier retryFunction(Supplier supplier, int maxRetries) { + return () -> { + int retries = 0; + while (retries < maxRetries) { + try { + return supplier.get(); + } catch (Exception e) { + retries++; + } + } + throw new IllegalStateException(String.format("Task failed after %s attempts", maxRetries)); + }; + } + + public static CompletableFuture retryUnsafe(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100l); + for (int i = 0; i < maxRetries; i++) { + cf = cf.exceptionally(__ -> supplier.get()); + } + return cf; + } + + public static CompletableFuture retryNesting(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100); + for (int i = 0; i < maxRetries; i++) { + cf = cf.thenApply(CompletableFuture::completedFuture) + .exceptionally(__ -> CompletableFuture.supplyAsync(supplier)) + .thenCompose(Function.identity()); + } + return cf; + } + + public static CompletableFuture retryExceptionallyAsync(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100); + for (int i = 0; i < maxRetries; i++) { + cf = cf.exceptionallyAsync(__ -> supplier.get()); + } + return cf; + } + + private static void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java new file mode 100644 index 0000000000..b48039d4a6 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java @@ -0,0 +1,125 @@ +package com.baeldung.concurrent.completablefuture.retry; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; + +import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class RetryCompletableFutureUnitTest { + private AtomicInteger retriesCounter = new AtomicInteger(0); + + @BeforeEach + void beforeEach() { + retriesCounter.set(0); + } + + @Test + void whenRetryingTask_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryTask(codeToRun, 10); + + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } + + @Test + void whenRetryingTask_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryTask(codeToRun, 3); + + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("IllegalStateException: Task failed after 3 attempts"); + } + + @Test + void whenRetryingExceptionally_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryUnsafe(codeToRun, 10); + + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } + + @Test + void whenRetryingExceptionally_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryUnsafe(codeToRun, 3); + + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } + + @Test + void whenRetryingExceptionallyAsync_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryExceptionallyAsync(codeToRun, 10); + + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } + + @Test + void whenRetryingExceptionallyAsync_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryExceptionallyAsync(codeToRun, 3); + + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } + + @Test + void whenRetryingNesting_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryNesting(codeToRun, 10); + + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } + + @Test + void whenRetryingNesting_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); + + CompletableFuture result = retryNesting(codeToRun, 3); + + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } + + int failFourTimesThenReturn(int returnValue) { + int retryNr = retriesCounter.get(); + System.out.println(String.format("invocation: %s, thread: %s", retryNr, Thread.currentThread().getName())); + if (retryNr < 4) { + retriesCounter.set(retryNr + 1); + throw new RuntimeException(String.format("task failed for %s time(s)", retryNr)); + } + return returnValue; + } + +} From 696ac5670a346963efe2f9725ef75e02373318e7 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 14 Oct 2023 17:08:46 +0300 Subject: [PATCH 088/831] JAVA-25805 Review log statements for projects - Week 41 - 2023 --- .../com/baeldung/magicsquare/MagicSquare.java | 2 -- spring-4/src/test/resources/logback-test.xml | 19 +++++++++++++++++++ .../src/test/resources/logback-test.xml | 15 +++++++++++++++ .../src/test/resources/logback-test.xml | 2 ++ .../java/com/baeldung/SpringContextTest.java | 1 - .../src/test/resources/logback-test.xml | 19 +++++++++++++++++++ 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 spring-4/src/test/resources/logback-test.xml create mode 100644 spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-server/src/test/resources/logback-test.xml create mode 100644 spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/MagicSquare.java b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/MagicSquare.java index b6e7ac24f5..f2ddd65ff7 100644 --- a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/MagicSquare.java +++ b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/MagicSquare.java @@ -1,7 +1,5 @@ package com.baeldung.magicsquare; -import org.junit.platform.commons.util.StringUtils; - import java.util.stream.IntStream; public class MagicSquare { diff --git a/spring-4/src/test/resources/logback-test.xml b/spring-4/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..a273ab5d26 --- /dev/null +++ b/spring-4/src/test/resources/logback-test.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-server/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-server/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..6fc9dc1151 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-bus/spring-cloud-bus-server/src/test/resources/logback-test.xml @@ -0,0 +1,15 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + diff --git a/spring-cloud-modules/spring-cloud-functions/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-functions/src/test/resources/logback-test.xml index 8d4771e308..41283752a9 100644 --- a/spring-cloud-modules/spring-cloud-functions/src/test/resources/logback-test.xml +++ b/spring-cloud-modules/spring-cloud-functions/src/test/resources/logback-test.xml @@ -6,6 +6,8 @@ + + diff --git a/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java index a15ca31980..62b1ae908b 100644 --- a/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-ldap/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,5 @@ package com.baeldung; -import com.baeldung.SampleLDAPApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml b/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file From 4e0b27b017cc7d30a997ec2efc4ade1706da1263 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sat, 14 Oct 2023 21:55:00 +0530 Subject: [PATCH 089/831] Review Comments --- .../ValidationControllerUnitTest.java | 13 ------------- .../java/com/baeldung/dto/BooleanUnitTest.java | 17 +++++------------ 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java index ad0e3ecdfa..f05d76e3f1 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/controller/ValidationControllerUnitTest.java @@ -36,18 +36,15 @@ class ValidationControllerUnitTest { @Test void whenNullInputForBooleanField_thenHttpBadRequestAsHttpResponse() throws Exception { - String postBody = "{\"boolField\":null,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) .andExpect(status().isBadRequest()); - } @Test void whenInvalidInputForTrueBooleanField_thenErrorResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":false,\"falseField\":false,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") @@ -61,7 +58,6 @@ class ValidationControllerUnitTest { @Test void whenInvalidInputForFalseBooleanField_thenErrorResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":true,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") @@ -75,7 +71,6 @@ class ValidationControllerUnitTest { @Test void whenInvalidBooleanFromJson_thenErrorResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"plus\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") @@ -85,12 +80,10 @@ class ValidationControllerUnitTest { .getContentAsString(); assertEquals("Only values accepted as Boolean are + and -", output); - } @Test void whenAllBooleanFieldsValid_thenCorrectResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":false,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") @@ -100,30 +93,25 @@ class ValidationControllerUnitTest { .getContentAsString(); assertEquals("BooleanObject is valid", output); - } @Test void givenAllBooleanFieldsValid_whenServiceValidationFails_thenErrorResponse() throws Exception { - mockMvc.perform(post("/validateBooleanAtService").contentType("application/json")) .andExpect(status().isInternalServerError()); } @Test void whenNullInputForTrueBooleanField_thenCorrectResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":null,\"falseField\":false,\"boolStringVar\":\"+\"}"; mockMvc.perform(post("/validateBoolean").contentType("application/json") .content(postBody)) .andExpect(status().isOk()); - } @Test void whenNullInputForFalseBooleanField_thenHttpBadRequestAsHttpResponse() throws Exception { - String postBody = "{\"boolField\":true,\"trueField\":true,\"falseField\":null,\"boolStringVar\":\"+\"}"; String output = mockMvc.perform(post("/validateBoolean").contentType("application/json") @@ -133,6 +121,5 @@ class ValidationControllerUnitTest { .getContentAsString(); assertEquals("falseField cannot be null", output); - } } diff --git a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java index 30270ee512..9ab04794c6 100644 --- a/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java +++ b/spring-boot-modules/spring-boot-validations/src/test/java/com/baeldung/dto/BooleanUnitTest.java @@ -8,21 +8,14 @@ class BooleanUnitTest { @Test void givenInputAsString_whenStringToBoolean_thenValidBooleanConversion() { - Boolean trueVar = Boolean.valueOf("TRUE"); - Boolean falseVar = Boolean.valueOf("false"); - Boolean parsedVar = Boolean.parseBoolean("True"); - - assertEquals(Boolean.TRUE, trueVar); - assertEquals(Boolean.FALSE, falseVar); - assertEquals(Boolean.TRUE, parsedVar); + assertEquals(Boolean.TRUE, Boolean.valueOf("TRUE")); + assertEquals(Boolean.FALSE, Boolean.valueOf("false")); + assertEquals(Boolean.TRUE, Boolean.parseBoolean("True")); } @Test void givenInputAsboolean_whenbooleanToBoolean_thenValidBooleanConversion() { - Boolean trueVar = Boolean.valueOf(true); - Boolean falseVar = Boolean.valueOf(false); - - assertEquals(Boolean.TRUE, trueVar); - assertEquals(Boolean.FALSE, falseVar); + assertEquals(Boolean.TRUE, Boolean.valueOf(true)); + assertEquals(Boolean.FALSE, Boolean.valueOf(false)); } } From c97860452f0b9c41e5a5e165fae8490c6840b72b Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 14 Oct 2023 21:59:02 +0530 Subject: [PATCH 090/831] BAEL-6910 revert back changes from spring-boot-3 --- spring-boot-modules/spring-boot-3/pom.xml | 70 ------------ .../ConnectionDetailsApplication.java | 16 --- .../adapter/VaultAdapter.java | 107 ------------------ .../CustomCassandraConnectionDetails.java | 32 ------ ...ssandraConnectionDetailsConfiguration.java | 17 --- .../CustomElasticsearchConnectionDetails.java | 29 ----- ...csearchConnectionDetailsConfiguration.java | 17 --- .../CustomNeo4jConnectionDetails.java | 24 ---- ...omNeo4jConnectionDetailsConfiguration.java | 17 --- .../JdbcConnectionDetailsConfiguration.java | 17 --- .../MongoDBConnectionDetails.java | 14 --- ...MongoDBConnectionDetailsConfiguration.java | 17 --- .../PostgresConnectionDetails.java | 21 ---- .../R2dbcPostgresConnectionDetails.java | 22 ---- ...ostgresConnectionDetailsConfiguration.java | 17 --- .../RabbitMQConnectionDetails.java | 34 ------ ...abbitMQConnectionDetailsConfiguration.java | 17 --- .../RedisCacheConnectionDetails.java | 26 ----- .../RedisConnectionDetailsConfiguration.java | 17 --- .../entity/elastic/Person.java | 27 ----- .../entity/neo4j/Person.java | 27 ----- .../src/main/resources/application.yml | 2 +- .../application-cassandra.properties | 11 -- .../application-elastic.properties | 7 -- .../application-jdbc.properties | 7 -- .../application-mongo.properties | 8 -- .../application-neo4j.properties | 7 -- .../application-r2dbc.properties | 7 -- .../application-rabbitmq.properties | 7 -- .../application-redis.properties | 7 -- ...ssandra-connection-details-class-diag.puml | 27 ----- .../connection-details-sequence-design.puml | 16 --- .../docker-compose-cassandra.yml | 9 -- .../docker-compose-elastic.yml | 12 -- .../connectiondetails/docker-compose-jdbc.yml | 10 -- .../docker-compose-mongo.yml | 10 -- .../docker-compose-neo4j.yml | 8 -- .../docker-compose-rabbitmq.yml | 9 -- .../docker-compose-redis.yml | 8 -- .../docker-connectiondetails-compose.yml | 39 ------- ...csearch-connection-details-class-diag.puml | 25 ---- .../jdbcconnection-details-class-diag.puml | 25 ---- ...mongodb-connection-details-class-diag.puml | 19 ---- .../r2dbcconnection-details-class-diag.puml | 21 ---- ...abbitmq-connection-details-class-diag.puml | 27 ----- ...edis-connection-details-class-diagram.puml | 23 ---- ...andraConnectionDetailsIntegrationTest.java | 37 ------ ...earchConnectionDetailsIntegrationTest.java | 45 -------- .../JdbcConnectionDetailsIntegrationTest.java | 38 ------- ...ngoDBConnectionDetailsIntegrationTest.java | 47 -------- ...Neo4jConnectionDetailsIntegrationTest.java | 43 ------- ...R2dbcConnectionDetailsIntegrationTest.java | 40 ------- ...bitmqConnectionDetailsIntegrationTest.java | 62 ---------- ...acheConnnectionDetailsIntegrationTest.java | 34 ------ 54 files changed, 1 insertion(+), 1281 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java delete mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index 25927cc37b..bb8c5dd53c 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -119,75 +119,6 @@ org.springframework.boot spring-boot-starter-test - - org.springframework.boot - spring-boot-testcontainers - test - - - org.testcontainers - postgresql - test - - - org.testcontainers - junit-jupiter - ${testcontainers.version} - test - - - org.postgresql - postgresql - runtime - - - org.springframework.boot - spring-boot-starter-amqp - - - org.springframework.amqp - spring-rabbit-test - test - - - org.springframework.data - spring-data-redis - - - redis.clients - jedis - jar - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.postgresql - r2dbc-postgresql - runtime - - - org.springframework.boot - spring-boot-starter-data-r2dbc - - - io.projectreactor - reactor-test - test - - - org.springframework.boot - spring-boot-starter-data-elasticsearch - - - org.springframework.boot - spring-boot-starter-data-cassandra - - - org.springframework.boot - spring-boot-starter-data-neo4j - @@ -284,7 +215,6 @@ 3.2.0-SNAPSHOT 0.2.0 5.10.0 - 1.18.3 diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java deleted file mode 100644 index a9b49e24e3..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/ConnectionDetailsApplication.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.connectiondetails; - - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -public class ConnectionDetailsApplication { - - public static void main(String[] args) { - SpringApplication.run(ConnectionDetailsApplication.class, args); - } - -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java deleted file mode 100644 index 1c9449ad00..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/adapter/VaultAdapter.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.baeldung.connectiondetails.adapter; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class VaultAdapter { - private static final Logger logger = LoggerFactory.getLogger(VaultAdapter.class); - public static String getSecret(String secretKey) { - logger.info("call vault to get the secret of key: " + secretKey); - - //Postgres keys - if (secretKey.equalsIgnoreCase("postgres_secret_key")) { - return "postgres"; - } - if (secretKey.equalsIgnoreCase("postgres_user_key")) { - return "postgres"; - } - if (secretKey.equalsIgnoreCase("postgres_jdbc_url")) { - return "jdbc:postgresql://localhost:15432/postgresdb"; - } - //RabbitMQ Server Keys - if (secretKey.equalsIgnoreCase("rabbitmq_username")) { - return "rabbitmquser"; - } - if (secretKey.equalsIgnoreCase("rabbitmq_password")) { - return "rabbitmq"; - } - if (secretKey.equalsIgnoreCase("rabbitmq_port")) { - return "5672"; - } - if (secretKey.equalsIgnoreCase("rabbitmq_host")) { - return "localhost"; - } - //Redis Server Keys - if (secretKey.equalsIgnoreCase("redis_username")) { - return null; - } - if (secretKey.equalsIgnoreCase("redis_password")) { - return "redis"; - } - if (secretKey.equalsIgnoreCase("redis_port")) { - return "6379"; - } - if (secretKey.equalsIgnoreCase("redis_host")) { - return "localhost"; - } - //Mongo DB Keys - if (secretKey.equalsIgnoreCase("mongo_connection_string")) { - return "mongodb://localhost:27017/demodb"; - } - - //r2dbc Keys - if (secretKey.equalsIgnoreCase("r2dbc_postgres_user")) { - return "postgres"; - } - if (secretKey.equalsIgnoreCase("r2dbc_postgres_secret")) { - return "postgres"; - } - if (secretKey.equalsIgnoreCase("r2dbc_postgres_host")) { - return "localhost"; - } - if (secretKey.equalsIgnoreCase("r2dbc_postgres_port")) { - return "15432"; - } - if (secretKey.equalsIgnoreCase("r2dbc_postgres_database")) { - return "postgresdb"; - } - //Elastic Search Keys - if (secretKey.equalsIgnoreCase("elastic_user")) { - return "elastic"; - } - if (secretKey.equalsIgnoreCase("elastic_secret")) { - return "secret"; - } - if (secretKey.equalsIgnoreCase("elastic_host")) { - return "localhost"; - } - if (secretKey.equalsIgnoreCase("elastic_port1")) { - return "19200"; - } - if (secretKey.equalsIgnoreCase("elastic_port2")) { - return "19300"; - } - //Cassandra keys - if (secretKey.equalsIgnoreCase("cassandra_user")) { - return "cassandra"; - } - if (secretKey.equalsIgnoreCase("cassandra_secret")) { - return "secret"; - } - if (secretKey.equalsIgnoreCase("cassandra_host")) { - return "localhost"; - } - if (secretKey.equalsIgnoreCase("cassandra_port")) { - return "19042"; - } - //Neo4j Keys - if (secretKey.equalsIgnoreCase("neo4j_secret")) { - return "neo4j123"; - } - if (secretKey.equalsIgnoreCase("neo4j_uri")) { - return "bolt://localhost:17687"; - } - - return "secretVal"; - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java deleted file mode 100644 index 6a246cd9fc..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetails.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; - -import java.util.List; - -public class CustomCassandraConnectionDetails implements CassandraConnectionDetails { - @Override - public List getContactPoints() { - Node node = new Node( - VaultAdapter.getSecret("cassandra_host"), - Integer.parseInt(VaultAdapter.getSecret("cassandra_port")) - ); - return List.of(node); - } - - @Override - public String getUsername() { - return VaultAdapter.getSecret("cassandra_user"); - } - - @Override - public String getPassword() { - return VaultAdapter.getSecret("cassandra_secret"); - } - - @Override - public String getLocalDatacenter() { - return "datacenter-1"; - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java deleted file mode 100644 index 02ed8c0051..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomCassandraConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.cassandra.CassandraConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("cassandra") -public class CustomCassandraConnectionDetailsConfiguration { - @Bean - @Primary - public CassandraConnectionDetails getCustomCassandraConnectionDetails() { - return new CustomCassandraConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java deleted file mode 100644 index 0b45878bc9..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetails.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; - -import java.util.List; - -public class CustomElasticsearchConnectionDetails implements ElasticsearchConnectionDetails { - @Override - public List getNodes() { - Node node1 = new Node( - VaultAdapter.getSecret("elastic_host"), - Integer.parseInt(VaultAdapter.getSecret("elastic_port1")), - Node.Protocol.HTTP - ); - return List.of(node1); - } - - @Override - public String getUsername() { - return VaultAdapter.getSecret("elastic_user"); - } - - @Override - public String getPassword() { - return VaultAdapter.getSecret("elastic_secret"); - } - -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java deleted file mode 100644 index a9b3da44fa..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomElasticsearchConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("elastic") -public class CustomElasticsearchConnectionDetailsConfiguration { - @Bean - @Primary - public ElasticsearchConnectionDetails getCustomElasticConnectionDetails() { - return new CustomElasticsearchConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java deleted file mode 100644 index c0412fbb21..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetails.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.neo4j.driver.AuthToken; -import org.neo4j.driver.AuthTokens; -import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; - -import java.net.URI; -import java.net.URISyntaxException; - -public class CustomNeo4jConnectionDetails implements Neo4jConnectionDetails { - @Override - public URI getUri() { - try { - return new URI(VaultAdapter.getSecret("neo4j_uri")); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - @Override - public AuthToken getAuthToken() { - return AuthTokens.basic("neo4j", VaultAdapter.getSecret("neo4j_secret")); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java deleted file mode 100644 index aec8908c7d..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/CustomNeo4jConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.neo4j.Neo4jConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("neo4j") -public class CustomNeo4jConnectionDetailsConfiguration { - @Bean - @Primary - public Neo4jConnectionDetails getNeo4jConnectionDetails() { - return new CustomNeo4jConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java deleted file mode 100644 index 3387356366..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/JdbcConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("jdbc") -public class JdbcConnectionDetailsConfiguration { - @Bean - @Primary - public JdbcConnectionDetails getPostgresConnection() { - return new PostgresConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java deleted file mode 100644 index df689d81b6..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetails.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import com.mongodb.ConnectionString; -import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; - -public class MongoDBConnectionDetails implements MongoConnectionDetails { - @Override - public ConnectionString getConnectionString() { - return new ConnectionString(VaultAdapter.getSecret("mongo_connection_string")); - } -} - diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java deleted file mode 100644 index d455991d08..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/MongoDBConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("mongo") -public class MongoDBConnectionDetailsConfiguration { - @Bean - @Primary - public MongoConnectionDetails getMongoConnectionDetails() { - return new MongoDBConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java deleted file mode 100644 index c9b213a8d3..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/PostgresConnectionDetails.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; - -public class PostgresConnectionDetails implements JdbcConnectionDetails { - @Override - public String getUsername() { - return VaultAdapter.getSecret("postgres_user_key"); - } - - @Override - public String getPassword() { - return VaultAdapter.getSecret("postgres_secret_key"); - } - - @Override - public String getJdbcUrl() { - return VaultAdapter.getSecret("postgres_jdbc_url"); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java deleted file mode 100644 index 4ce6abc9d5..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import io.r2dbc.spi.ConnectionFactoryOptions; -import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; - -public class R2dbcPostgresConnectionDetails implements R2dbcConnectionDetails { - @Override - public ConnectionFactoryOptions getConnectionFactoryOptions() { - - ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() - .option(ConnectionFactoryOptions.DRIVER, "postgresql") - .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host")) - .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port"))) - .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user")) - .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret")) - .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database")) - .build(); - - return options; - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java deleted file mode 100644 index 144355dce4..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("r2dbc") -public class R2dbcPostgresConnectionDetailsConfiguration { - @Bean - @Primary - public R2dbcConnectionDetails getR2dbcPostgresConnectionDetails() { - return new R2dbcPostgresConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java deleted file mode 100644 index 9dc4bdf33b..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetails.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; - -import java.util.List; - -public class RabbitMQConnectionDetails implements RabbitConnectionDetails { - @Override - public String getUsername() { - return VaultAdapter.getSecret("rabbitmq_username"); - } - - @Override - public String getPassword() { - return VaultAdapter.getSecret("rabbitmq_password"); - } - - @Override - public String getVirtualHost() { - return "/"; - } - - @Override - public List
getAddresses() { - return List.of(this.getFirstAddress()); - } - - @Override - public Address getFirstAddress() { - return new Address(VaultAdapter.getSecret("rabbitmq_host"), - Integer.parseInt(VaultAdapter.getSecret("rabbitmq_port"))); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java deleted file mode 100644 index 237bec3fc4..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RabbitMQConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.amqp.RabbitConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("rabbitmq") -public class RabbitMQConnectionDetailsConfiguration { - @Primary - @Bean - public RabbitConnectionDetails getRabbitmqConnection() { - return new RabbitMQConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java deleted file mode 100644 index 9485f22240..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisCacheConnectionDetails.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import com.baeldung.connectiondetails.adapter.VaultAdapter; -import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; - -public class RedisCacheConnectionDetails implements RedisConnectionDetails { - @Override - public String getPassword() { - return VaultAdapter.getSecret("redis_password"); - } - - @Override - public Standalone getStandalone() { - return new Standalone() { - @Override - public String getHost() { - return VaultAdapter.getSecret("redis_host"); - } - - @Override - public int getPort() { - return Integer.parseInt(VaultAdapter.getSecret("redis_port")); - } - }; - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java deleted file mode 100644 index 31816ff0b4..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/configuration/RedisConnectionDetailsConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.connectiondetails.configuration; - -import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; - -@Configuration(proxyBeanMethods = false) -@Profile("redis") -public class RedisConnectionDetailsConfiguration { - @Bean - @Primary - public RedisConnectionDetails getRedisCacheConnection() { - return new RedisCacheConnectionDetails(); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java deleted file mode 100644 index 851dbb7c90..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/elastic/Person.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.connectiondetails.entity.elastic; - -import org.springframework.data.annotation.Id; -import org.springframework.data.elasticsearch.annotations.Document; - -@Document(indexName = "person") -public class Person { - String name; - @Id - String ssn; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSsn() { - return ssn; - } - - public void setSsn(String ssn) { - this.ssn = ssn; - } -} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java deleted file mode 100644 index 63e88d0a41..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/connectiondetails/entity/neo4j/Person.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.connectiondetails.entity.neo4j; - -import org.springframework.data.neo4j.core.schema.Id; -import org.springframework.data.neo4j.core.schema.Node; - -@Node -public class Person { - @Id - String name; - String zipcode; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getZipcode() { - return zipcode; - } - - public void setZipcode(String zipcode) { - this.zipcode = zipcode; - } -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml index b1e79ca17e..3885e59a61 100644 --- a/spring-boot-modules/spring-boot-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-3/src/main/resources/application.yml @@ -19,7 +19,7 @@ spring: compose: enabled: false autoconfigure: - exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration + exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration cors: allow: diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties deleted file mode 100644 index ea2619bada..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-cassandra.properties +++ /dev/null @@ -1,11 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-cassandra.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=cassandra -spring.cassandra.local-datacenter=dc1 -#spring.cassandra.keyspace-name=spring_cassandra -#spring.cassandra.schema-action=CREATE_IF_NOT_EXISTS -spring.data.cassandra.request.timeout=20000 # Set your desired timeout in milliseconds -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties deleted file mode 100644 index e9f32c252b..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-elastic.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-elastic.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=elastic -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties deleted file mode 100644 index 40f9d1fd68..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-jdbc.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=jdbc -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties deleted file mode 100644 index 4dd355bbed..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-mongo.properties +++ /dev/null @@ -1,8 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-mongo.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=mongo -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration -spring.data.mongodb.database=demodb \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties deleted file mode 100644 index 9e6c9c0f11..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-neo4j.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-neo4j.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=neo4j -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties deleted file mode 100644 index 91d2fba818..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-r2dbc.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-jdbc.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=r2dbc -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties deleted file mode 100644 index fe9bfa3ecb..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-rabbitmq.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-rabbitmq.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=rabbitmq -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties deleted file mode 100644 index 9e4973164e..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/application-redis.properties +++ /dev/null @@ -1,7 +0,0 @@ -spring.docker.compose.enabled=true -spring.docker.compose.file=./connectiondetails/docker-compose-redis.yml -spring.docker.compose.skip.in-tests=false -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.mustache.check-template-location=false -spring.profiles.active=redis -spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration, org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration, org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration, org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration, org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration, org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.neo4j.Neo4jAutoConfiguration \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml deleted file mode 100644 index 339f658e1a..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/cassandra-connection-details-class-diag.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface CassandraConnectionDetails { - +getUsername():String - +getPassword():String - +getContactPoints():List - +getLocalDatacenter():String -} -class CustomCassandraConnectionDetails { - +getUsername():String - +getPassword():String - +getContactPoints():List - +getLocalDatacenter():String -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class CustomCassandraConnectionDetailsConfiguration { - +getCustomCassandraConnectionDetails():CassandraConnectionDetails -} -CustomCassandraConnectionDetails -left-> VaultAdapter:uses -CustomCassandraConnectionDetails -right-|> CassandraConnectionDetails : implements -CustomCassandraConnectionDetailsConfiguration -up-> CustomCassandraConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml deleted file mode 100644 index a2a917eea0..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/connection-details-sequence-design.puml +++ /dev/null @@ -1,16 +0,0 @@ -@startuml -'https://plantuml.com/sequence-diagram -skinparam sequenceMessageAlign direction -skinparam handwritten true -skinparam sequence { -ParticipantBackgroundColor beige -ParticipantPadding 50 -} -autonumber - -"Spring Boot" -[#63b175]> "Hashicorp Vault": Secret Request -"Hashicorp Vault" -[#63b175]-> "Spring Boot": Secret Response -"Spring Boot" -[#63b175]> "Remote Service": Connection Request - -"Remote Service" -[#63b175]-> "Spring Boot": Connection Response -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml deleted file mode 100644 index c593cbc73b..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-cassandra.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '3.8' -services: - cassandra: - image: 'cassandra:latest' - environment: - - 'CASSANDRA_DC=datacenter-1' - - 'CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch' - ports: - - '19042:9042' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml deleted file mode 100644 index a6e51ee1a0..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-elastic.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: '3.8' -services: - elasticsearch: - image: 'docker.elastic.co/elasticsearch/elasticsearch:7.17.10' - environment: - - 'ELASTIC_USERNAME=elastic' - - 'ELASTIC_PASSWORD=secret' - - 'discovery.type=single-node' - - 'xpack.security.enabled=false' - ports: - - '19200:9200' -# - '19300:9300' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml deleted file mode 100644 index 65a8f135e8..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-jdbc.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: '3.8' -services: - database: - image: 'postgres:13.1-alpine' - ports: - - '15432:5432' - environment: - - 'POSTGRES_USER=postgres' - - 'POSTGRES_DB=postgresdb' - - 'POSTGRES_PASSWORD=postgres' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml deleted file mode 100644 index f12f5c3aa7..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-mongo.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: '3.8' -services: - mongodb: - image: 'mongo:latest' - environment: - - 'MONGO_INITDB_DATABASE=demodb' -# - 'MONGO_INITDB_ROOT_PASSWORD=Mongo123' -# - 'MONGO_INITDB_ROOT_USERNAME=mongouser' - ports: - - '27017:27017' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml deleted file mode 100644 index 611951e755..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-neo4j.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: '3.8' -services: - neo4j: - image: 'neo4j:latest' - ports: - - '17687:7687' - environment: - NEO4J_AUTH: neo4j/neo4j123 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml deleted file mode 100644 index 8abf19bd19..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-rabbitmq.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '3.8' -services: - rabbitmq: - image: 'rabbitmq:latest' - environment: - - 'RABBITMQ_DEFAULT_PASS=rabbitmq' - - 'RABBITMQ_DEFAULT_USER=rabbitmquser' - ports: - - '5672:5672' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml deleted file mode 100644 index c218cef998..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-compose-redis.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: '3.8' -services: - redis: - image: 'redis:latest' - ports: - - '6379:6379' - environment: - - 'REDIS_REQUIREPASS=redis' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml deleted file mode 100644 index 4d2bded9eb..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/docker-connectiondetails-compose.yml +++ /dev/null @@ -1,39 +0,0 @@ -version: '3.8' -services: - database: - profiles: - - 'jdbc' - image: 'postgres:13.1-alpine' - ports: - - '15432:5432' - environment: - - 'POSTGRES_USER=postgres' - - 'POSTGRES_DB=postgresdb' - - 'POSTGRES_PASSWORD=postgres' - rabbitmq: - profiles: - - 'rabbitmq' - image: 'rabbitmq:latest' - environment: - - 'RABBITMQ_DEFAULT_PASS=rabbitmq' - - 'RABBITMQ_DEFAULT_USER=rabbitmquser' - ports: - - '5672:5672' - redis: - profiles: - - 'redis' - image: 'redis:latest' - ports: - - '6379:6379' - environment: - - 'REDIS_REQUIREPASS=redis' -# mongodb: -# profiles: -# - 'mongo-test' -# image: 'mongo:latest' -# environment: -# - 'MONGO_INITDB_DATABASE=demodb' -# - 'MONGO_INITDB_ROOT_PASSWORD=mongo' -# - 'MONGO_INITDB_ROOT_USERNAME=mongouser' -# ports: -# - '27017:27017' \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml deleted file mode 100644 index 48db0bcc4f..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/elasticsearch-connection-details-class-diag.puml +++ /dev/null @@ -1,25 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface ElasticsearchConnectionDetails { - +getUsername():String - +getPassword():String - +getNodes():List -} -class CustomElasticsearchConnectionDetails { - +getUsername():String - +getPassword():String - +getNodes():List -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class CustomElasticsearchConnectionDetailsConfiguration { - +getCustomElasticConnectionDetails():ElasticsearchConnectionDetails -} -CustomElasticsearchConnectionDetails -left-> VaultAdapter:uses -CustomElasticsearchConnectionDetails -right-|> ElasticsearchConnectionDetails : implements -CustomElasticsearchConnectionDetailsConfiguration -up-> CustomElasticsearchConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml deleted file mode 100644 index 88de5d607f..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/jdbcconnection-details-class-diag.puml +++ /dev/null @@ -1,25 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface JdbcConnectionDetails { - +getUsername():String - +getPassword():String - +getJdbcUrl():String -} -class PostgresConnectionDetails { - +getUsername():String - +getPassword():String - +getJdbcUrl():String -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class JdbcConnectonDetailsConfiguration { - +getPostgresConnection():JdbcConnectionDetails -} -PostgresConnectionDetails -left-> VaultAdapter:uses -PostgresConnectionDetails -right-|> JdbcConnectionDetails : implements -JdbcConnectonDetailsConfiguration -up-> PostgresConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml deleted file mode 100644 index 974c6de601..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/mongodb-connection-details-class-diag.puml +++ /dev/null @@ -1,19 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface MongoConnectionDetails { - getConnectionString():ConnectionString -} -class MongoDBConnectionDetails { - getConnectionString():ConnectionString -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class MongoDBConnectionDetailsConfiguration { - +getMongoConnectionDetails() : MongoConnectionDetails -} -MongoDBConnectionDetails -left-> VaultAdapter:uses -MongoDBConnectionDetails -right-|> MongoConnectionDetails : implements -MongoDBConnectionDetailsConfiguration -up-> MongoDBConnectionDetails:uses -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml deleted file mode 100644 index ec69587ab9..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/r2dbcconnection-details-class-diag.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface R2dbcConnectionDetails { - +getConnectionFactoryOptions():ConnectionFactoryOptions -} -class R2dbcPostgresConnectionDetails { - +getConnectionFactoryOptions():ConnectionFactoryOptions -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class R2dbcPostgresConnectionDetailsConfiguration { - +getR2dbcPostgresConnectionDetails():R2dbcConnectionDetails -} -R2dbcPostgresConnectionDetails -right-> VaultAdapter:uses -R2dbcPostgresConnectionDetails -up-|> R2dbcConnectionDetails:implements -R2dbcPostgresConnectionDetailsConfiguration -up-> R2dbcPostgresConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml deleted file mode 100644 index 0541e12915..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/rabbitmq-connection-details-class-diag.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface RabbitConnectionDetails { - +getUsername():String - +getPassword():String - +getFirstAddress():Address - +getAddresses():List
-} -class RabbitMQConnectionDetails { - +getUsername():String - +getPassword():String - +getFirstAddress():Address - +getAddresses():List
-} -class VaultAdapter { - +getSecret(String secretKey):String -} -class RabbitMQConnectionDetailsConfiguration { - +getRabbitmqConnection() : RabbitConnectionDetails -} -RabbitMQConnectionDetails -left-> VaultAdapter:uses -RabbitMQConnectionDetails -right-|> RabbitConnectionDetails : implements -RabbitMQConnectionDetailsConfiguration -up-> RabbitMQConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml b/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml deleted file mode 100644 index a18c83a8be..0000000000 --- a/spring-boot-modules/spring-boot-3/src/main/resources/connectiondetails/redis-connection-details-class-diagram.puml +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -'https://plantuml.com/class-diagram - -interface RedisConnectionDetails { - +getPassword():String - +getStandalone():Standalone -} -class RedisCacheConnectionDetails { - +getPassword():String - +getStandalone():Standalone -} -class VaultAdapter { - +getSecret(String secretKey):String -} -class RedisConnectonDetailsConfiguration { - +getRedisCacheConnection():RedisConnectionDetails -} -RedisCacheConnectionDetails -left-> VaultAdapter:uses -RedisCacheConnectionDetails -right-|> RedisConnectionDetails : implements -RedisConnectonDetailsConfiguration -up-> RedisCacheConnectionDetails:uses - - -@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java deleted file mode 100644 index 6380f6375f..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.data.cassandra.core.CassandraTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(CustomCassandraConnectionDetailsConfiguration.class) -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -@TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"}) -@ActiveProfiles("cassandra") -public class CassandraConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class); - @Autowired - private CassandraTemplate cassandraTemplate; - @Test - public void givenHashicorpVault_whenRunQuery_thenSuccess() { - Boolean result = cassandraTemplate.getCqlOperations() - .execute("CREATE KEYSPACE IF NOT EXISTS spring_cassandra" - + " WITH replication = {'class':'SimpleStrategy', 'replication_factor':3}"); - logger.info("the result -" + result); - assertTrue(result); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java deleted file mode 100644 index ad4110c7e5..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration; -import com.baeldung.connectiondetails.entity.elastic.Person; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(CustomElasticsearchConnectionDetailsConfiguration.class) -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -@TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"}) -@ActiveProfiles("elastic") -public class ElasticsearchConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class); - @Autowired - private ElasticsearchTemplate elasticsearchTemplate; - - @Before - public void prepare() { - if (elasticsearchTemplate.indexOps(Person.class).exists()) { - elasticsearchTemplate.indexOps(Person.class).delete(); - } - } - @Test - public void givenHashicorpVault_whenCreateIndexInElastic_thenSuccess() { - - Boolean result = elasticsearchTemplate.indexOps(Person.class).create(); - logger.info("index created:" + result); - assertTrue(result); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java deleted file mode 100644 index 748bc27b0b..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import java.sql.Date; -import java.time.LocalDate; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(JdbcConnectionDetailsConfiguration.class) -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -@TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"}) -@ActiveProfiles("jdbc") -public class JdbcConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class); - @Autowired - private JdbcTemplate jdbcTemplate; - @Test - public void givenSecretVault_whenIntegrateWithPostgres_thenConnectionSuccessful() { - String sql = "select current_date;"; - Date date = jdbcTemplate.queryForObject(sql, Date.class); - assertEquals(LocalDate.now().toString(), date.toString()); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java deleted file mode 100644 index edd6da3448..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration; -import org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration; -import org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.query.Query; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(MongoDBConnectionDetailsConfiguration.class) -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -@TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"}) -@ActiveProfiles("mongo") -public class MongoDBConnectionDetailsIntegrationTest { - - @Autowired - private MongoTemplate mongoTemplate; - @Test - public void givenMongoDB_whenExecuteQuery_ReturnResult() throws JSONException { - mongoTemplate.insert("{\"msg\":\"My First Entry in MongoDB\"}", "myDemoCollection"); - String result = mongoTemplate.find(new Query(), String.class, "myDemoCollection").get(0); - - JSONObject jsonObject = new JSONObject(result); - result = jsonObject.get("msg").toString(); - R2dbcAutoConfiguration r2dbcAutoConfiguration; - R2dbcDataAutoConfiguration r2dbcDataAutoConfiguration; - R2dbcRepositoriesAutoConfiguration r2dbcRepositoriesAutoConfiguration; - - assertEquals("My First Entry in MongoDB", result); - } -} - diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java deleted file mode 100644 index 88a9529822..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration; -import com.baeldung.connectiondetails.entity.neo4j.Person; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.data.neo4j.core.Neo4jTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(CustomNeo4jConnectionDetailsConfiguration.class) -@ComponentScan(basePackages = "com.baeldung.connectiondetails") -@TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"}) -@ActiveProfiles("neo4j") -public class Neo4jConnectionDetailsIntegrationTest { - @Autowired - private Neo4jTemplate neo4jTemplate; - - @After - public void cleanup() { - neo4jTemplate.deleteAll(Person.class); - } - @Test - public void giveHashicorpVault_whenRunQuery_thenSuccess() { - Person person = new Person(); - person.setName("James"); - person.setZipcode("751003"); - - Person data = neo4jTemplate.save(person); - assertEquals("James", data.getName()); - } - -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java deleted file mode 100644 index b24071a1f1..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.List; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(R2dbcPostgresConnectionDetailsConfiguration.class) -@TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"}) -@ActiveProfiles("r2dbc") -public class R2dbcConnectionDetailsIntegrationTest { - Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class); - @Autowired - private R2dbcEntityTemplate r2dbcEntityTemplate; - - @Test - public void givenHashicorpVault_whenQueryPostgresReactive_thenSuccess() { - - String sql = "select * from information_schema.tables"; - - List result = r2dbcEntityTemplate.getDatabaseClient().sql(sql).fetch().all() - .map(r -> { - return "hello " + r.get("table_name").toString(); - - }).collectList().block(); - logger.info("count ------" + result.size()); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java deleted file mode 100644 index 2793ac0126..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.amqp.core.Queue; -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitAdmin; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(RabbitMQConnectionDetailsConfiguration.class) -@TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"}) -@ActiveProfiles("rabbitmq") -public class RabbitmqConnectionDetailsIntegrationTest { - - private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class); - - @Autowired - private RabbitTemplate rabbitTemplate; - - @Autowired - private CachingConnectionFactory connectionFactory; - - private final static String queueName = "Test_Queue"; - - RabbitAdmin rabbitAdmin; - - @Before - public void setup() { - logger.info("create new queue"); - rabbitAdmin = new RabbitAdmin(connectionFactory); - logger.info("creating queue: " + rabbitAdmin.declareQueue(new Queue(queueName))); - connectionFactory.destroy(); - } - - @After - public void cleanup() { - logger.info("delete queue"); - this.rabbitAdmin.deleteQueue(queueName, false, true); - } - @Test - public void givenRabbitmq_whenPublishMessage_thenSuccess() { - logger.info("sending message to queue " + queueName); - final String MSG = "this is a test message"; - this.rabbitTemplate.convertAndSend(queueName, MSG); - assertEquals(MSG, this.rabbitTemplate.receiveAndConvert(queueName)); - } -} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java deleted file mode 100644 index 6ca963a261..0000000000 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.connectiondetails; - -import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ConnectionDetailsApplication.class) -@Import(RedisConnectionDetailsConfiguration.class) -@TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"}) -@ActiveProfiles("redis") -public class RedisCacheConnnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class); - - @Autowired - RedisTemplate redisTemplate; - - @Test - public void giveRedisCache_whenKeyVal_storeInCache() { - redisTemplate.opsForValue().set("City", "New York"); - assertEquals("New York", redisTemplate.opsForValue().get("City")); - } -} From aafe9dcc6e9b6034ca5cbe467ffc26fac2be30fb Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:07:38 +0530 Subject: [PATCH 091/831] BAEL-6910 Added spring-boot-3-2 --- spring-boot-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 2b4a94a7a5..461264012a 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -92,6 +92,7 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-3-testcontainers + spring-boot-3-2 spring-boot-resilience4j spring-boot-properties spring-boot-properties-2 From 600e49890be50f8b0886c03b141db6b0c3081d91 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:17:22 +0530 Subject: [PATCH 092/831] BAEL-6910 2 space indents --- .../R2dbcPostgresConnectionDetails.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java index 4ce6abc9d5..613ec83124 100644 --- a/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java +++ b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/connectiondetails/configuration/R2dbcPostgresConnectionDetails.java @@ -9,13 +9,13 @@ public class R2dbcPostgresConnectionDetails implements R2dbcConnectionDetails { public ConnectionFactoryOptions getConnectionFactoryOptions() { ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() - .option(ConnectionFactoryOptions.DRIVER, "postgresql") - .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host")) - .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port"))) - .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user")) - .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret")) - .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database")) - .build(); + .option(ConnectionFactoryOptions.DRIVER, "postgresql") + .option(ConnectionFactoryOptions.HOST, VaultAdapter.getSecret("r2dbc_postgres_host")) + .option(ConnectionFactoryOptions.PORT, Integer.valueOf(VaultAdapter.getSecret("r2dbc_postgres_port"))) + .option(ConnectionFactoryOptions.USER, VaultAdapter.getSecret("r2dbc_postgres_user")) + .option(ConnectionFactoryOptions.PASSWORD, VaultAdapter.getSecret("r2dbc_postgres_secret")) + .option(ConnectionFactoryOptions.DATABASE, VaultAdapter.getSecret("r2dbc_postgres_database")) + .build(); return options; } From 75ab55e8d241e0bc68223ef873ff16e78cb35bf8 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 14 Oct 2023 22:57:45 +0530 Subject: [PATCH 093/831] BAEL-6910 corrected name --- spring-boot-modules/spring-boot-3-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index 88a60bf881..c28a527da1 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -5,7 +5,7 @@ 4.0.0 spring-boot-3-2 0.0.1-SNAPSHOT - spring-boot-3-1 + spring-boot-3-2 Demo project for Spring Boot From f252aed40c15ddf353a582d74ddec6bae5e3efe3 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 14 Oct 2023 23:22:49 +0530 Subject: [PATCH 094/831] BAEL-6910 removed java version --- spring-boot-modules/spring-boot-3-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index c28a527da1..62369f6670 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -252,7 +252,7 @@ - 19 + 1.5.2.Final 2.0.0 3.0.0-M7 From 34dac9716eaecf03e47e88e6a2d33ceb76572560 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 14 Oct 2023 23:16:17 +0300 Subject: [PATCH 095/831] [JAVA-12183] Fixed server settings location --- web-modules/restx/src/main/java/restx/demo/AppServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-modules/restx/src/main/java/restx/demo/AppServer.java b/web-modules/restx/src/main/java/restx/demo/AppServer.java index 7275047e0b..089a22c9ae 100644 --- a/web-modules/restx/src/main/java/restx/demo/AppServer.java +++ b/web-modules/restx/src/main/java/restx/demo/AppServer.java @@ -12,8 +12,8 @@ import restx.server.Jetty11WebServer; * Reading the port from system env PORT makes it compatible with heroku. */ public class AppServer { - public static final String WEB_INF_LOCATION = "web-modules/restx/src/main/webapp/WEB-INF/web.xml"; - public static final String WEB_APP_LOCATION = "web-modules/restx/src/main/webapp"; + public static final String WEB_INF_LOCATION = "src/main/webapp/WEB-INF/web.xml"; + public static final String WEB_APP_LOCATION = "src/main/webapp"; public static void main(String[] args) throws Exception { int port = Integer.valueOf(Optional.fromNullable(System.getenv("PORT")).or("8080")); From 9fcdc43c5c6b66b9fe134fafaa30786d0c605faf Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 14 Oct 2023 21:45:28 +0100 Subject: [PATCH 096/831] Update pom.xml --- spring-security-modules/spring-security-core-2/pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/pom.xml b/spring-security-modules/spring-security-core-2/pom.xml index 55eaf262df..5d77098869 100644 --- a/spring-security-modules/spring-security-core-2/pom.xml +++ b/spring-security-modules/spring-security-core-2/pom.xml @@ -15,6 +15,10 @@ ../../parent-boot-2 + + 5.8.4 + + org.springframework.boot @@ -52,12 +56,12 @@ org.springframework.security spring-security-web - 5.8.4 + ${spring.security.version} org.springframework.security spring-security-core - 5.8.4 + ${spring.security.version} From 4fb3cb257717e61b8c37327fc760dedffea058b3 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 14 Oct 2023 21:49:30 +0100 Subject: [PATCH 097/831] Update HttpSecurityConfig.java --- .../HttpSecurityConfig.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java index bfa8fa8633..47c4c8de4c 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java @@ -13,18 +13,17 @@ public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { // Given: HttpSecurity configured - http - .authorizeRequests() - .antMatchers("/public/**").permitAll() - .antMatchers("/admin/**").hasRole("ADMIN") - .anyRequest().authenticated() + http.authorizeRequests() + .antMatchers("/public/**").permitAll() + .antMatchers("/admin/**").hasRole("ADMIN") + .anyRequest().authenticated() .and() .formLogin() - .loginPage("/login") - .permitAll() + .loginPage("/login") + .permitAll() .and() .logout() - .permitAll(); + .permitAll(); // When: Accessing specific URLs // Then: Access is granted based on defined rules From 0bbc9163f9f301ba43f99da5d64ce69069d3a467 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 14 Oct 2023 21:50:59 +0100 Subject: [PATCH 098/831] Update WebSecurityConfig.java --- .../WebSecurityConfig.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 9d0a3cfb55..702becbf06 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -18,16 +18,17 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth - .userDetailsService(userDetailsService) - .passwordEncoder(new BCryptPasswordEncoder()); + .userDetailsService(userDetailsService) + .passwordEncoder(new BCryptPasswordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/").permitAll() - .anyRequest().authenticated() + http.authorizeRequests() + .antMatchers("/") + .permitAll() + .anyRequest() + .authenticated() .and() .formLogin(); } From 8042c7d71dda883b65cecf24426f47802fceb0f7 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 15 Oct 2023 13:07:45 +0530 Subject: [PATCH 099/831] Update README.md (#14995) --- spring-boot-rest/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index 365a21781c..ee12036528 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -1,6 +1,6 @@ ## Spring Boot REST -This module contains articles about Spring Boot RESTful APIs. +### ! This module contains articles about Spring Boot RESTful APIs. It should not be moved or used to store the code for any further article. ### Relevant Articles From fcb0f98b92680f12d24f5c83e3a7dcb6ece26bbf Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 15 Oct 2023 19:25:42 +0300 Subject: [PATCH 100/831] [JAVA-25997] Clean up --- spring-core-2/pom.xml | 4 +- spring-core-4/pom.xml | 4 +- spring-credhub/pom.xml | 5 +- spring-ejb-modules/ejb-beans/pom.xml | 8 +-- spring-kafka-2/pom.xml | 3 +- spring-kafka/pom.xml | 6 +- spring-katharsis/pom.xml | 4 +- spring-mobile/pom.xml | 8 --- spring-pulsar/pom.xml | 6 +- .../spring-5-reactive/pom.xml | 3 +- .../spring-reactive-data-2/pom.xml | 12 ++-- .../spring-reactive-security/pom.xml | 8 +-- spring-remoting-modules/pom.xml | 6 -- spring-shell/pom.xml | 1 - spring-soap/pom.xml | 9 ++- .../pom.xml | 15 +++-- .../pom.xml | 61 +++++++++++-------- .../spring-swagger-codegen-api-client/pom.xml | 15 ++--- spring-vault/pom.xml | 10 +-- 19 files changed, 102 insertions(+), 86 deletions(-) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f6142cffb0..2d11cc2124 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -149,7 +149,7 @@ org.apache.maven.plugins maven-war-plugin - ${maven.version} + ${maven-war-plugin.version} false @@ -166,7 +166,7 @@ 3.6 2.1.0 3.22.0-GA - 3.2.2 + 3.2.2 \ No newline at end of file diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml index 2d11cc701b..fb544e29fd 100644 --- a/spring-core-4/pom.xml +++ b/spring-core-4/pom.xml @@ -74,7 +74,7 @@ org.apache.commons commons-text - ${apache-commons-text.version} + ${commons-text.version} @@ -84,7 +84,7 @@ 4.0.2 4.0.0 1.3.2 - 1.10.0 + 1.10.0 \ No newline at end of file diff --git a/spring-credhub/pom.xml b/spring-credhub/pom.xml index 4604833d0b..defe378b6b 100644 --- a/spring-credhub/pom.xml +++ b/spring-credhub/pom.xml @@ -27,7 +27,7 @@ org.springframework.credhub spring-credhub-starter - 2.2.0 + ${spring-credhub-starter.version} com.google.code.gson @@ -36,8 +36,7 @@ - 8 - 8 + 2.2.0 UTF-8 diff --git a/spring-ejb-modules/ejb-beans/pom.xml b/spring-ejb-modules/ejb-beans/pom.xml index 6bfbb42a14..94f7963ad6 100644 --- a/spring-ejb-modules/ejb-beans/pom.xml +++ b/spring-ejb-modules/ejb-beans/pom.xml @@ -66,12 +66,12 @@ org.apache.activemq activemq-broker - ${activemq.broker.version} + ${activemq-broker.version} org.apache.activemq.tooling activemq-junit - ${activemq.junit.version} + ${activemq-junit.version} test @@ -187,8 +187,8 @@ 8.2.1.Final 3.2 5.2.3.RELEASE - 5.16.3 - 5.16.3 + 5.16.3 + 5.16.3 2.21.0 2.8 8.2.1.Final diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index 76a82f6000..2aa657d3d8 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -53,7 +53,7 @@ org.testcontainers junit-jupiter - ${testcontainers-kafka.version} + ${testcontainers-junit-jupiter.version} test @@ -65,6 +65,7 @@ 1.16.2 + 1.16.2 \ No newline at end of file diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index c013be32e3..7ff7a9710a 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -26,12 +26,12 @@ org.springframework.boot spring-boot-starter-actuator - 3.0.5 + ${spring-boot-starter-actuator.version} io.micrometer micrometer-registry-prometheus - 1.10.5 + ${micrometer-registry-prometheus.version} org.springframework.kafka @@ -90,6 +90,8 @@ + 3.0.5 + 1.10.5 1.16.2 diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index b836a42bca..595cde5109 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -33,7 +33,7 @@ io.katharsis katharsis-spring - ${katharsis.version} + ${katharsis-spring.version} org.apache.commons @@ -132,7 +132,7 @@ - 3.0.2 + 3.0.2 0.9.10 1.6.1 diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index f810159eb7..d96faf3274 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -37,24 +37,16 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - 1.1.5.RELEASE - 11 - 11 \ No newline at end of file diff --git a/spring-pulsar/pom.xml b/spring-pulsar/pom.xml index df1959c84e..05debcab1c 100644 --- a/spring-pulsar/pom.xml +++ b/spring-pulsar/pom.xml @@ -27,7 +27,7 @@ org.springframework.pulsar spring-pulsar-spring-boot-starter - 0.2.0 + ${spring-pulsar-spring-boot-starter.version} @@ -46,4 +46,8 @@ + + 0.2.0 + + diff --git a/spring-reactive-modules/spring-5-reactive/pom.xml b/spring-reactive-modules/spring-5-reactive/pom.xml index fd47c70a07..da04f2c0ca 100644 --- a/spring-reactive-modules/spring-5-reactive/pom.xml +++ b/spring-reactive-modules/spring-5-reactive/pom.xml @@ -124,7 +124,7 @@ maven-resources-plugin - 3.0.1 + ${maven-resources-plugin.version} copy-resources @@ -159,6 +159,7 @@ 1.1.3 1.0 1.0 + 3.0.1 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-data-2/pom.xml b/spring-reactive-modules/spring-reactive-data-2/pom.xml index 64ce278973..47662a2c2e 100644 --- a/spring-reactive-modules/spring-reactive-data-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-2/pom.xml @@ -13,10 +13,6 @@ 1.0.0-SNAPSHOT - - UTF-8 - - org.springframework.boot @@ -62,8 +58,14 @@ javax.validation validation-api - 2.0.1.Final + ${validation-api.version} + + + 2.0.1.Final + UTF-8 + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index 8ed976c572..956153b49a 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -80,12 +80,12 @@ io.reactivex.rxjava2 rxjava - ${rxjava-version} + ${rxjava.version} io.projectreactor reactor-test - ${project-reactor-test} + ${project-reactor-test.version} test @@ -114,11 +114,11 @@ 1.0.1.RELEASE - 2.1.12 + 2.1.12 1.1.3 1.0 1.0 - 3.1.6.RELEASE + 3.1.6.RELEASE \ No newline at end of file diff --git a/spring-remoting-modules/pom.xml b/spring-remoting-modules/pom.xml index 41d77c2969..8a5990fd1d 100644 --- a/spring-remoting-modules/pom.xml +++ b/spring-remoting-modules/pom.xml @@ -43,16 +43,10 @@ org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version} - - ${maven.compiler.source} - ${maven.compiler.target} - - 11 - 11 \ No newline at end of file diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml index 952920fd1e..24fe5b0fb6 100644 --- a/spring-shell/pom.xml +++ b/spring-shell/pom.xml @@ -28,7 +28,6 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} src/main/webapp false diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index 594eb3dd19..6c49f1f39c 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -34,7 +34,7 @@ jakarta.xml.bind jakarta.xml.bind-api - 4.0.0 + ${jakarta.xml.bind-api.version} @@ -58,7 +58,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 3.1.0 + ${jaxb2-maven-plugin.version} xjc @@ -79,7 +79,7 @@ org.jvnet.jaxb2.maven2 maven-jaxb2-plugin - 0.15.3 + ${maven-jaxb2-plugin.version} @@ -103,5 +103,8 @@ 17 + 4.0.0 + 3.1.0 + 0.15.3 \ No newline at end of file diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index c529951b07..b57a014a8f 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -29,22 +29,22 @@ org.hibernate hibernate-validator - 6.0.10.Final + ${hibernate-validator.version} javax.validation validation-api - 2.0.1.Final + ${validation-api.version} org.openapitools openapi-generator - 3.3.4 + ${openapi-generator.version} com.fasterxml.jackson.core jackson-databind - 2.10.0.pr3 + ${jackson-databind.version} org.springdoc @@ -62,7 +62,7 @@ org.openapitools openapi-generator-maven-plugin - 5.1.0 + ${openapi-generator-maven-plugin.version} @@ -97,6 +97,11 @@ 3.0.0 2.17.1 1.7.0 + 6.0.10.Final + 2.0.1.Final + 3.3.4 + 2.10.0.pr3 + 5.1.0 \ No newline at end of file diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml index f125018fb0..ee2c86238a 100644 --- a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml @@ -34,55 +34,55 @@ io.swagger swagger-annotations - ${swagger-annotations-version} + ${swagger-annotations.version} com.google.code.findbugs jsr305 - 3.0.2 + ${findbugs-jsr305.version} org.springframework spring-web - ${spring-web-version} + ${spring-web.version} com.fasterxml.jackson.core jackson-core - ${jackson-version} + ${jackson.version} com.fasterxml.jackson.core jackson-annotations - ${jackson-version} + ${jackson.version} com.fasterxml.jackson.core jackson-databind - ${jackson-version} + ${jackson.version} com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider - ${jackson-version} + ${jackson.version} org.openapitools jackson-databind-nullable - ${jackson-databind-nullable-version} + ${jackson-databind-nullable.version} com.fasterxml.jackson.datatype jackson-datatype-jsr310 - ${jackson-version} + ${jackson.version} com.github.joschi.jackson jackson-datatype-threetenbp - ${jackson-threetenbp-version} + ${jackson-threetenbp.version} @@ -94,7 +94,7 @@ javax.annotation javax.annotation-api - 1.3.2 + ${javax.annotation-api.version} @@ -103,7 +103,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M1 + ${maven-enforcer-plugin.version} enforce-maven @@ -123,7 +123,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.12 + ${maven-surefire-plugin.version} @@ -154,7 +154,7 @@ org.apache.maven.plugins maven-jar-plugin - 2.2 + ${maven-jar-plugin.version} @@ -169,7 +169,7 @@ org.codehaus.mojo build-helper-maven-plugin - 1.10 + ${build-helper-maven-plugin.version} add_sources @@ -200,7 +200,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + ${maven-compiler-plugin.version} 1.8 1.8 @@ -209,7 +209,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + ${maven-javadoc-plugin.version} attach-javadocs @@ -222,7 +222,7 @@ org.apache.maven.plugins maven-source-plugin - 2.2.1 + ${maven-source-plugin.version} attach-sources @@ -243,7 +243,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.5 + ${maven-gpg-plugin.version} sign-artifacts @@ -260,14 +260,25 @@ - 1.5.22 - 4.3.9.RELEASE - 2.11.1 + 1.5.22 + 4.3.9.RELEASE + 3.0.2 + 2.11.1 - 0.2.1 - 2.9.10 - 1.0.0 + 0.2.1 + 2.9.10 + 1.0.0 5.8.1 + 1.3.2 + + 3.0.0-M1 + 2.12 + 2.2 + 1.10 + 3.6.1 + 2.10.4 + 2.2.1 + 1.5 \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index b2e97c7a49..35f4978411 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -40,13 +40,13 @@ io.swagger swagger-annotations - ${swagger-annotations-version} + ${swagger-annotations.version} org.springframework spring-web - ${spring-web-version} + ${spring-web.version} @@ -77,12 +77,12 @@ joda-time joda-time - ${jodatime-version} + ${jodatime.version} javax.annotation javax.annotation-api - 1.3.2 + ${javax.annotation-api.version} @@ -189,9 +189,10 @@ - 1.5.15 - 4.3.9.RELEASE - 2.9.9 + 1.5.15 + 4.3.9.RELEASE + 2.9.9 + 1.3.2 2.2 1.5 2.2.1 diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index 60a5ee18f2..dba6a02e4e 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -36,7 +36,7 @@ org.springframework.vault spring-vault-core - ${spring.vault.core.version} + ${spring-vault-core.version} org.springframework.data @@ -69,18 +69,20 @@ software.amazon.awssdk auth - 2.20.140 + ${auth.version} org.springframework.cloud spring-cloud-starter-vault-config - 3.1.3 + ${spring-cloud-starter-vault-config.version}3.1.3 - 2.3.4 + 2.3.4 + 2.20.140 + 3.1.3 17 From d520b7529140dbf9373c79289a36e53b8dbc2be2 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Sun, 15 Oct 2023 18:43:23 +0200 Subject: [PATCH 101/831] Create README.md --- spring-boot-modules/spring-boot-validations/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-modules/spring-boot-validations/README.md diff --git a/spring-boot-modules/spring-boot-validations/README.md b/spring-boot-modules/spring-boot-validations/README.md new file mode 100644 index 0000000000..0d07204f3f --- /dev/null +++ b/spring-boot-modules/spring-boot-validations/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Validate Boolean Type in Spring Boot](https://www.baeldung.com/spring-boot-validate-boolean-type) From 8772eaa67351c29e44db9c391225bb9602af2469 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:28:15 -0400 Subject: [PATCH 102/831] Single and Multiple Partition test. --- apache-kafka-2/pom.xml | 3 +- .../message/ordering/payload/Message.java | 14 +++ .../ordering/MultiplePartitionTest.java | 114 +++++++++++++++++ .../message/ordering/SinglePartitionTest.java | 115 ++++++++++++++++++ 4 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index 45b31004b7..d0838a386e 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -60,7 +60,7 @@ com.fasterxml.jackson.core jackson-databind - 2.15.2 + ${jackson.databind.version} @@ -69,6 +69,7 @@ 2.8.0 1.15.3 1.15.3 + 2.15.2 \ No newline at end of file diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java index b185d663d4..317aec699e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -1,5 +1,6 @@ package com.baeldung.kafka.message.ordering.payload; +import javax.swing.*; import java.util.Random; public class Message implements Comparable { @@ -10,6 +11,7 @@ public class Message implements Comparable { } + //Required for Kafka Serialization and Deserialization public Message(long insertPosition, long messageId) { this.insertPosition = insertPosition; this.messageId = messageId; @@ -28,6 +30,18 @@ public class Message implements Comparable { return Long.compare(this.messageId, other.messageId); } + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof Message)) { + return false; + } + Message message = (Message) obj; + return this.messageId == message.getMessageId() && this.insertPosition == message.getInsertPosition(); + } + public static long getRandomMessageId() { Random rand = new Random(); return rand.nextInt(1000); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java new file mode 100644 index 0000000000..586c328f79 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java @@ -0,0 +1,114 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import lombok.var; +import org.apache.kafka.clients.admin.*; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.KafkaFuture; +import org.apache.kafka.common.PartitionInfo; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import static org.junit.jupiter.api.Assertions.*; + +@Testcontainers +public class MultiplePartitionTest { + private static String TOPIC = "multi_partition_topic"; + private static int PARTITIONS = 5; + private static short REPLICATION_FACTOR = 1; + private static Admin admin; + private static KafkaProducer producer; + private static KafkaConsumer consumer; + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + @BeforeAll + static void setup() throws ExecutionException, InterruptedException { + KAFKA_CONTAINER.addExposedPort(9092); + + Properties adminProperties = new Properties(); + adminProperties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + producerProperties.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + consumerProperties.put("value.deserializer.serializedClass", Message.class); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + admin = Admin.create(adminProperties); + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + List topicList = new ArrayList<>(); + NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + topicList.add(newTopic); + CreateTopicsResult result = admin.createTopics(topicList); + KafkaFuture future = result.values().get(TOPIC); + future.whenComplete((voidResult, exception) -> { + if (exception != null) { + System.err.println("Error creating the topic: " + exception.getMessage()); + } else { + System.out.println("Topic created successfully!"); + } + }).get(); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void givenMultiplePartitions_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { + List sentMessageList = new ArrayList<>(); + List receivedMessageList = new ArrayList<>(); + for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { + long messageId = Message.getRandomMessageId(); + String key = "Key-" + insertPosition; + Message message = new Message(insertPosition, messageId); + Future future = producer.send(new ProducerRecord<>(TOPIC, key, message)); + sentMessageList.add(message); + RecordMetadata metadata = future.get(); + System.out.println("Partition : " + metadata.partition()); + } + + boolean isOrderMaintained = true; + consumer.subscribe(Collections.singletonList(TOPIC)); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + Message message = record.value(); + receivedMessageList.add(message); + }); + for (int insertPosition = 0; insertPosition <= receivedMessageList.size() - 1; insertPosition++) { + if (isOrderMaintained){ + Message sentMessage = sentMessageList.get(insertPosition); + Message receivedMessage = receivedMessageList.get(insertPosition); + if (!sentMessage.equals(receivedMessage)) { + isOrderMaintained = false; + } + } + } + assertFalse(isOrderMaintained); + } +} diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java new file mode 100644 index 0000000000..afffbcc28e --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java @@ -0,0 +1,115 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import org.apache.kafka.clients.admin.Admin; +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.CreateTopicsResult; +import org.apache.kafka.clients.admin.NewTopic; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.KafkaFuture; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Testcontainers +public class SinglePartitionTest { + private static String TOPIC = "single_partition_topic"; + private static int PARTITIONS = 1; + private static short REPLICATION_FACTOR = 1; + private static Admin admin; + private static KafkaProducer producer; + private static KafkaConsumer consumer; + + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + @BeforeAll + static void setup() throws ExecutionException, InterruptedException { + KAFKA_CONTAINER.addExposedPort(9092); + + Properties adminProperties = new Properties(); + adminProperties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + producerProperties.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + consumerProperties.put("value.deserializer.serializedClass", Message.class); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + admin = Admin.create(adminProperties); + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + List topicList = new ArrayList<>(); + NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + topicList.add(newTopic); + CreateTopicsResult result = admin.createTopics(topicList); + KafkaFuture future = result.values().get(TOPIC); + future.whenComplete((voidResult, exception) -> { + if (exception != null) { + System.err.println("Error creating the topic: " + exception.getMessage()); + } else { + System.out.println("Topic created successfully!"); + } + }).get(); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void givenASinglePartition_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { + List sentMessageList = new ArrayList<>(); + List receivedMessageList = new ArrayList<>(); + for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { + long messageId = Message.getRandomMessageId(); + String key = "Key-" + insertPosition; + Message message = new Message(insertPosition, messageId); + ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, key, message); + Future future = producer.send(producerRecord); + sentMessageList.add(message); + RecordMetadata metadata = future.get(); + System.out.println("Partition : " + metadata.partition()); + } + + consumer.subscribe(Collections.singletonList(TOPIC)); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + Message message = record.value(); + receivedMessageList.add(message); + }); + boolean result = true; + for (int count = 0; count <= 9 ; count++) { + Message sentMessage = sentMessageList.get(count); + Message receivedMessage = receivedMessageList.get(count); + if (!sentMessage.equals(receivedMessage) && result){ + result = false; + } + } + assertTrue(result); + } +} From c4aac70277435d53363e2e99f8a26de8d2729585 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:46:35 -0400 Subject: [PATCH 103/831] User Constants instead od repeatative strings --- .../baeldung/kafka/message/ordering/Config.java | 5 +++++ .../message/ordering/MultiplePartitionTest.java | 14 +++++++++----- .../message/ordering/SinglePartitionTest.java | 14 +++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java new file mode 100644 index 0000000000..2635e72431 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java @@ -0,0 +1,5 @@ +package com.baeldung.kafka.message.ordering; + +public class Config { + public static final String CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS = "value.deserializer.serializedClass"; +} diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java index 586c328f79..5b68544f95 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java @@ -1,6 +1,8 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import lombok.var; import org.apache.kafka.clients.admin.*; import org.apache.kafka.clients.consumer.ConsumerConfig; @@ -12,6 +14,8 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.KafkaFuture; import org.apache.kafka.common.PartitionInfo; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -47,15 +51,15 @@ public class MultiplePartitionTest { Properties producerProperties = new Properties(); producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - producerProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - producerProperties.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - consumerProperties.put("value.deserializer.serializedClass", Message.class); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java index afffbcc28e..807e21bfa8 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java @@ -1,6 +1,8 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.AdminClientConfig; import org.apache.kafka.clients.admin.CreateTopicsResult; @@ -13,6 +15,8 @@ import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.KafkaFuture; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -49,15 +53,15 @@ public class SinglePartitionTest { Properties producerProperties = new Properties(); producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - producerProperties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - producerProperties.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - consumerProperties.put("value.deserializer.serializedClass", Message.class); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); From 1d1aaeedb6eea4201a8a92eade16f2ec62ef588c Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:57:42 -0400 Subject: [PATCH 104/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index bcdf6ceb32..60ae5fc2f8 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -13,7 +13,7 @@ public class ProducerConfigurations { props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("max.in.flight.requests.per.connection", "1"); props.put("batch.size", "16384"); - props.put("linger.ms", "5"); + props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); KafkaProducer producer = new KafkaProducer<>(props); for (int i = 0; i < 10; i++) { From f8ea1db5ccd727c2e06912a04eac3b9de4088341 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:58:27 -0400 Subject: [PATCH 105/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 60ae5fc2f8..566605973c 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -12,7 +12,7 @@ public class ProducerConfigurations { props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("max.in.flight.requests.per.connection", "1"); - props.put("batch.size", "16384"); + props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); KafkaProducer producer = new KafkaProducer<>(props); From 463e45d025682fbd4eecbb73165c460ef9f7ea03 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:58:33 -0400 Subject: [PATCH 106/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 566605973c..c9cef04bbc 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -11,7 +11,7 @@ public class ProducerConfigurations { props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - props.put("max.in.flight.requests.per.connection", "1"); + props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); KafkaProducer producer = new KafkaProducer<>(props); From 836c977fdea79eda47f2e5989709d73f40e5f593 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:58:43 -0400 Subject: [PATCH 107/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index c9cef04bbc..81d91693fe 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -8,7 +8,7 @@ import java.util.Properties; public class ProducerConfigurations { public static void main(String[] args) { Properties props = new Properties(); - props.put("bootstrap.servers", "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); From 540da8c7795ac450793347b927e6c6a800c06c25 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:58:57 -0400 Subject: [PATCH 108/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java Co-authored-by: Liam Williams --- .../message/ordering/serialization/JacksonSerializer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java index fa9d25dd85..2d7432cc7b 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java @@ -3,6 +3,10 @@ package com.baeldung.kafka.message.ordering.serialization; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.kafka.common.serialization.Serializer; +/** + * Configured via {@link org.apache.kafka.clients.producer.ProducerConfig#VALUE_SERIALIZER_CLASS_CONFIG} + */ +@SuppressWarnings("unused") public class JacksonSerializer implements Serializer { private final ObjectMapper objectMapper = new ObjectMapper(); From c3af2facae6cdc5b3a27607eec2d079f1a670d9f Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:59:07 -0400 Subject: [PATCH 109/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java Co-authored-by: Liam Williams --- .../message/ordering/serialization/JacksonDeserializer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 34aa181fcb..f3c8aaf60f 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -4,6 +4,10 @@ import org.apache.kafka.common.serialization.Deserializer; import java.util.Map; +/** + * Configured via {@link org.apache.kafka.clients.consumer.ConsumerConfig#VALUE_DESERIALIZER_CLASS_CONFIG} + */ +@SuppressWarnings("unused") public class JacksonDeserializer implements Deserializer { private final ObjectMapper objectMapper = new ObjectMapper(); private Class tClass; From d31cf69b4d5d2ca8d88cbebf6aee72b84dba96b3 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 15:59:38 -0400 Subject: [PATCH 110/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/MultiPartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index 8b2a49b2b5..0fd20c2ab1 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -11,7 +11,7 @@ public class MultiPartitionProducer { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { From 857da48e742306babf0579436aa2baf0c3ea5a0c Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:00:04 -0400 Subject: [PATCH 111/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 81d91693fe..ae3f2839c8 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -10,7 +10,7 @@ public class ProducerConfigurations { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); From e35327cade00d1be3bedc513e416dc9de28f177a Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:00:49 -0400 Subject: [PATCH 112/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/MultiPartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index 0fd20c2ab1..04ffdd3336 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -10,7 +10,7 @@ public class MultiPartitionProducer { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); - props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); From 2dd76f7e78bad11206916195f15a81c0f79f9aad Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:01:50 -0400 Subject: [PATCH 113/831] Review comment incorporation --- .../kafka/message/ordering/ProducerConfigurations.java | 1 + .../kafka/message/ordering/payload/Message.java | 3 ++- .../ordering/serialization/JacksonDeserializer.java | 10 +++++----- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 60ae5fc2f8..2c885b7caa 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -1,6 +1,7 @@ package com.baeldung.kafka.message.ordering; import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java index 317aec699e..095aeef89a 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -2,6 +2,7 @@ package com.baeldung.kafka.message.ordering.payload; import javax.swing.*; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; public class Message implements Comparable { private long insertPosition; @@ -44,7 +45,7 @@ public class Message implements Comparable { public static long getRandomMessageId() { Random rand = new Random(); - return rand.nextInt(1000); + return ThreadLocalRandom.current().nextInt(1000); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 34aa181fcb..cb0b77e4c0 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -6,10 +6,10 @@ import java.util.Map; public class JacksonDeserializer implements Deserializer { private final ObjectMapper objectMapper = new ObjectMapper(); - private Class tClass; + private Class type; - public JacksonDeserializer(Class tClass) { - this.tClass = tClass; + public JacksonDeserializer(Class type) { + this.type = type; } public JacksonDeserializer() { @@ -18,7 +18,7 @@ public class JacksonDeserializer implements Deserializer { @Override public void configure(Map configs, boolean isKey) { - this.tClass = (Class) configs.get("value.deserializer.serializedClass"); + this.type = (Class) configs.get("value.deserializer.serializedClass"); } @Override @@ -27,7 +27,7 @@ public class JacksonDeserializer implements Deserializer { return null; } try { - return objectMapper.readValue(bytes, tClass); + return objectMapper.readValue(bytes, type); } catch (Exception e) { throw new RuntimeException("Error deserializing value", e); } From 51cf5cee5fe1ec871163291a4e97071c024dcb1d Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:02:15 -0400 Subject: [PATCH 114/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/MultiPartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index 04ffdd3336..b565941fa5 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -9,7 +9,7 @@ import java.util.Properties; public class MultiPartitionProducer { public static void main(String[] args) { Properties props = new Properties(); - props.put("bootstrap.servers", "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); From 9eed20e483f00dde53393c3d0ae541a107a7696c Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:03:11 -0400 Subject: [PATCH 115/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/ExtSeqWithTimeWindowProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index 91c5af716f..59bfb397ec 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -13,7 +13,7 @@ public class ExtSeqWithTimeWindowProducer { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { From 6da6a92a797d02ac0086c6591d949a58fc148f3b Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:03:28 -0400 Subject: [PATCH 116/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/ExtSeqWithTimeWindowProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index 59bfb397ec..b4b890ffe7 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -12,7 +12,7 @@ public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); - props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); From 576b08076f59695d7286afcdf25145630de2ab1a Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:03:53 -0400 Subject: [PATCH 117/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/ExtSeqWithTimeWindowProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index b4b890ffe7..69f50352ad 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicLong; public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { Properties props = new Properties(); - props.put("bootstrap.servers", "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); From 3c716605b90ddf32311a5459aacab1cf41a55566 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:04:07 -0400 Subject: [PATCH 118/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/SinglePartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index b5366819c5..1610df746c 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -10,7 +10,7 @@ import java.util.Random; public class SinglePartitionProducer { public static void main(String[] args) { Properties props = new Properties(); - props.put("bootstrap.servers", "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); From d408db30f209eda244bb505055b09935822e4ad9 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:05:27 -0400 Subject: [PATCH 119/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/SinglePartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index 1610df746c..03f89b9a55 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -12,7 +12,7 @@ public class SinglePartitionProducer { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); - props.put("value.serializer", "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { From f2a69a8bb11a482237230c7261bcebdb1c87af97 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:07:42 -0400 Subject: [PATCH 120/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ConsumerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java index b18db3ef24..8af4e576ce 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -18,7 +18,7 @@ public class ConsumerConfigurations { props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put("max.poll.records", "500"); props.put("fetch.min.bytes", "1"); - props.put("fetch.max.wait.ms", "500"); + props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); From 89eed31dbd38d7bcc784dfbe99ea13bf1e136788 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:08:05 -0400 Subject: [PATCH 121/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ConsumerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java index 8af4e576ce..9f3d8b9d5c 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -17,7 +17,7 @@ public class ConsumerConfigurations { props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put("max.poll.records", "500"); - props.put("fetch.min.bytes", "1"); + props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1"); props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); From d850d6c30cbad40b5245b58f06ac0173ecfb3546 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:08:27 -0400 Subject: [PATCH 122/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ProducerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 5dc917e308..af06fa04de 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -10,7 +10,7 @@ public class ProducerConfigurations { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); From d85a01e524432d27f146d89609d6935d81aef091 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:08:54 -0400 Subject: [PATCH 123/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/SinglePartitionProducer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index 03f89b9a55..869a260da6 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -11,7 +11,7 @@ public class SinglePartitionProducer { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") - props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); KafkaProducer producer = new KafkaProducer<>(props); From 29096686cc7de507162dc4c468a574ce5932a538 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:09:36 -0400 Subject: [PATCH 124/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/ConsumerConfigurations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java index 9f3d8b9d5c..b3faceaa44 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -16,7 +16,7 @@ public class ConsumerConfigurations { props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - props.put("max.poll.records", "500"); + props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "500"); props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1"); props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); Consumer consumer = new KafkaConsumer<>(props); From 8934c1492ff3923045794bd65c0c93711214838c Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 15 Oct 2023 22:27:03 +0200 Subject: [PATCH 125/831] [put-vs-computeIfAbsent] Difference Between putIfAbsent and computeIfAbsent in Java Map (#14977) --- .../PutIfAbsentVsComputeIfAbsentUnitTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/PutIfAbsentVsComputeIfAbsentUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/PutIfAbsentVsComputeIfAbsentUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/PutIfAbsentVsComputeIfAbsentUnitTest.java new file mode 100644 index 0000000000..304045ab9d --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/PutIfAbsentVsComputeIfAbsentUnitTest.java @@ -0,0 +1,98 @@ +package com.baeldung.map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +class Magic { + public String nullFunc() { + return null; + } + + public String strFunc(String input) { + return input + ": A nice string"; + } +} + +public class PutIfAbsentVsComputeIfAbsentUnitTest { + + private static final Map MY_MAP = new HashMap<>(); + private Magic magic = new Magic(); + + @BeforeEach + void resetTheMap() { + MY_MAP.clear(); + MY_MAP.put("Key A", "value A"); + MY_MAP.put("Key B", "value B"); + MY_MAP.put("Key C", "value C"); + MY_MAP.put("Key Null", null); + } + + @Test + void whenCallingPutIfAbsentWithAbsentKey_thenGetNull() { + String putResult = MY_MAP.putIfAbsent("new key1", magic.nullFunc()); + assertNull(putResult); + + putResult = MY_MAP.putIfAbsent("new key2", magic.strFunc("new key2")); + assertNull(putResult); + + putResult = MY_MAP.putIfAbsent("Key Null", magic.strFunc("Key Null")); + assertNull(putResult); + } + + @Test + void whenCallingComputeIfAbsentWithAbsentKey_thenGetExpectedResult() { + String computeResult = MY_MAP.computeIfAbsent("new key1", k -> magic.nullFunc()); + assertNull(computeResult); + + computeResult = MY_MAP.computeIfAbsent("new key2", k -> magic.strFunc(k)); + assertEquals("new key2: A nice string", computeResult); + + computeResult = MY_MAP.computeIfAbsent("Key Null", k -> magic.strFunc(k)); + assertEquals("Key Null: A nice string", computeResult); + } + + @Test + void whenCallingPutIfAbsentWithAbsentKey_thenNullIsPut() { + assertEquals(4, MY_MAP.size()); // initial: 4 entries + MY_MAP.putIfAbsent("new key", magic.nullFunc()); + assertEquals(5, MY_MAP.size()); + assertTrue(MY_MAP.containsKey("new key")); // new entry has been added to the map + assertNull(MY_MAP.get("new key")); + } + + @Test + void whenCallingComputeIfAbsentWithAbsentKey_thenNullIsNotPut() { + assertEquals(4, MY_MAP.size()); // initial: 4 entries + MY_MAP.computeIfAbsent("new key", k -> magic.nullFunc()); + assertEquals(4, MY_MAP.size()); + assertFalse(MY_MAP.containsKey("new key")); // <- no new entry added + } + + @Test + void whenCallingPutIfAbsent_thenFunctionIsAlwaysCalled() { + Magic spyMagic = spy(magic); + MY_MAP.putIfAbsent("Key A", spyMagic.strFunc("Key A")); + verify(spyMagic, times(1)).strFunc(anyString()); + + MY_MAP.putIfAbsent("new key", spyMagic.strFunc("new key")); + verify(spyMagic, times(2)).strFunc(anyString()); + } + + @Test + void whenCallingComputeIfAbsent_thenFunctionIsCalledOnDemand() { + Magic spyMagic = spy(magic); + MY_MAP.computeIfAbsent("Key A", k -> spyMagic.strFunc(k)); + verify(spyMagic, never()).strFunc(anyString()); + + MY_MAP.computeIfAbsent("new key", k -> spyMagic.strFunc(k)); + verify(spyMagic, times(1)).strFunc(anyString()); + } + +} \ No newline at end of file From b94d5a1f8a8e2ce146b1d60d96f3ad3319c2976e Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 16:36:33 -0400 Subject: [PATCH 126/831] Incorporated Review Comments --- .../message/ordering/ConsumerConfigurations.java | 8 ++++++-- .../ordering/ExtSeqWithTimeWindowConsumer.java | 12 ++++++------ .../ordering/ExtSeqWithTimeWindowProducer.java | 9 ++++++--- .../message/ordering/MultiPartitionConsumer.java | 12 ++++++++---- .../message/ordering/MultiPartitionProducer.java | 7 +++++-- .../message/ordering/ProducerConfigurations.java | 5 +++-- .../message/ordering/SinglePartitionConsumer.java | 9 ++++++--- .../message/ordering/SinglePartitionProducer.java | 9 ++++++--- .../ordering/serialization/JacksonDeserializer.java | 6 ++++-- 9 files changed, 50 insertions(+), 27 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java index b3faceaa44..15562cfcef 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -1,9 +1,13 @@ package com.baeldung.kafka.message.ordering; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; import java.time.Duration; import java.util.Collections; @@ -14,8 +18,8 @@ public class ConsumerConfigurations { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "500"); props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1"); props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index 5b01a86e39..f5a0dbd640 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -1,10 +1,12 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.*; @@ -17,10 +19,10 @@ public class ExtSeqWithTimeWindowConsumer { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put("value.deserializer.serializedClass", Message.class); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); List buffer = new ArrayList<>(); @@ -28,9 +30,7 @@ public class ExtSeqWithTimeWindowConsumer { while (true) { ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { - if (record != null && record.value() != null) { - buffer.add(record.value()); - } + buffer.add(record.value()); }); if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_MS) { processBuffer(buffer); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index 69f50352ad..110015de25 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -1,8 +1,11 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; import java.util.Random; @@ -11,9 +14,9 @@ import java.util.concurrent.atomic.AtomicLong; public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java index f9b0b3b040..542a664745 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -1,10 +1,12 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.Collections; @@ -16,17 +18,19 @@ public class MultiPartitionConsumer { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put("value.deserializer.serializedClass", Message.class); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); while (true) { ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { Message message = record.value(); - System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + if (message != null) { + System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + } }); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index b565941fa5..bf9db58392 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -1,8 +1,11 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; @@ -10,8 +13,8 @@ public class MultiPartitionProducer { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index af06fa04de..0eb563910e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -3,6 +3,7 @@ package com.baeldung.kafka.message.ordering; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; @@ -10,8 +11,8 @@ public class ProducerConfigurations { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java index 932a29c394..e1a449055e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -1,10 +1,13 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; import java.time.Duration; import java.util.Collections; @@ -17,10 +20,10 @@ public class SinglePartitionConsumer { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put("value.deserializer.serializedClass", Message.class); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("single_partition_topic")); while (true) { diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index 869a260da6..c986089841 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -1,8 +1,11 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; import java.util.Random; @@ -10,9 +13,9 @@ import java.util.Random; public class SinglePartitionProducer { public static void main(String[] args) { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092") - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "com.baeldung.kafka.message.ordering.serialization.JacksonSerializer"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 2def07f987..be2b104761 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -1,4 +1,5 @@ package com.baeldung.kafka.message.ordering.serialization; +import com.baeldung.kafka.message.ordering.Config; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.kafka.common.serialization.Deserializer; @@ -22,7 +23,7 @@ public class JacksonDeserializer implements Deserializer { @Override public void configure(Map configs, boolean isKey) { - this.type = (Class) configs.get("value.deserializer.serializedClass"); + this.type = (Class) configs.get(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS); } @Override @@ -33,8 +34,9 @@ public class JacksonDeserializer implements Deserializer { try { return objectMapper.readValue(bytes, type); } catch (Exception e) { - throw new RuntimeException("Error deserializing value", e); + //throw new RuntimeException("Error deserializing value", e); } + return null; } } From ab62e675ec785b8cdc05689eb2805fcc356989e4 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Mon, 16 Oct 2023 01:21:36 +0300 Subject: [PATCH 127/831] This commit is related to the article BAEL-7017 (#14985) This commit aims to add a new test class named "WriteHashmaptoCVSFileUnitTest.java" that explains how to write HashMap to a CSV file. --- .../WriteHashmaptoCVSFileUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java new file mode 100644 index 0000000000..ddebaf2468 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.writehashmaptocsvfile; + +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class WriteHashmaptoCVSFileUnitTest { + + @Test + public void givenEmployeeData_whenWriteToCSV_thenCSVFileIsCreated() { + Map employeeData = new HashMap<>(); + employeeData.put("Name", "John Doe"); + employeeData.put("Title", "Software Engineer"); + employeeData.put("Department", "Engineering"); + employeeData.put("Salary", "75000"); + try (FileWriter csvWriter = new FileWriter("employee_data.csv")) { + // Write header row + csvWriter.append("Name,Title,Department,Salary\n"); + + // Write data row + csvWriter.append(employeeData.get("Name")).append(","); + csvWriter.append(employeeData.get("Title")).append(","); + csvWriter.append(employeeData.get("Department")).append(","); + csvWriter.append(employeeData.get("Salary")).append("\n"); + } catch (IOException e) { + e.printStackTrace(); + } + // Ensure the CSV file exists + assertTrue(new File("employee_data.csv").exists(), "CSV file does not exist!"); + + } + + @Test + public void givenCSVFile_whenRead_thenContentsMatchExpected() { + // Read the actual content of the CSV file + StringBuilder actualCsvContent = new StringBuilder(); + try { + Files.lines(Paths.get("employee_data.csv")) + .forEach(line -> actualCsvContent.append(line).append("\n")); + + // Define the expected CSV content + String expectedCsvContent = "Name,Title,Department,Salary\n" + + "John Doe,Software Engineer,Engineering,75000\n"; + + // Compare the actual content with the expected content + assertEquals(expectedCsvContent, actualCsvContent.toString()); + + System.out.println("CSV file created successfully."); + } catch (IOException e) { + e.printStackTrace(); + } + } +} From 0eafba3ba1116a52cca5fa5ff7688e017946228e Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Mon, 16 Oct 2023 01:25:13 +0300 Subject: [PATCH 128/831] This PR related to the article BAEL-7023 (#14993) * Update pom.xml * This commit related to the article BAEL-7023 This commit aims to add a test class 'CenteringTextUnitTest.java' proposing several ways to center text in Java. --- .../core-java-string-operations-7/README.md | 2 + .../core-java-string-operations-7/pom.xml | 72 +++++++++++++++++++ .../centertext/CenteringTextUnitTest.java | 47 ++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/README.md create mode 100644 core-java-modules/core-java-string-operations-7/pom.xml create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md new file mode 100644 index 0000000000..2dce44d217 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -0,0 +1,2 @@ + +### Relevant Articles: diff --git a/core-java-modules/core-java-string-operations-7/pom.xml b/core-java-modules/core-java-string-operations-7/pom.xml new file mode 100644 index 0000000000..595f918fcd --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + core-java-string-operations-7 + core-java-string-operations-7 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + ${apache.commons.lang3.version} + + + org.apache.commons + commons-text + ${commons-text.version} + + + org.liquibase + liquibase-core + 4.9.1 + test + + + org.junit.jupiter + junit-jupiter + 5.8.1 + test + + + org.liquibase + liquibase-core + 4.9.1 + test + + + junit + junit + 4.13.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 11 + 11 + 3.12.0 + 1.10.0 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java new file mode 100644 index 0000000000..ff53d8b3fa --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.centertext; + +import liquibase.repackaged.org.apache.commons.lang3.StringUtils; +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import static org.junit.Assert.assertEquals; + +public class CenteringTextUnitTest { + + @Test + public void givenTextAndTotalWidth_whenUsingStringFormat_thenTextIsCentered() { + String text = "Centered Text"; + int totalWidth = 20; + int padding = (totalWidth - text.length()) / 2; + String centeredText = String.format("%" + padding + "s%s%" + padding + "s", "", text, ""); + String expectedCenteredText = " Centered Text "; + Assert.assertEquals("Centered Text", expectedCenteredText, centeredText); + } + + @Test + public void givenTextAndTotalWidth_whenCenterUsingStringBuilder_thenTextIsCentered() { + String text = "Centered Text"; + int width = 20; + int padding = (width - text.length()) / 2; + StringBuilder centeredText = new StringBuilder(); + for (int i = 0; i < padding; i++) { + centeredText.append(" "); + } + centeredText.append(text); + for (int i = 0; i < padding; i++) { + centeredText.append(" "); + } + String centeredTextString = centeredText.toString(); + String expectedCenteredText = " Centered Text "; + Assert.assertEquals("Centered Text", expectedCenteredText, centeredTextString); + } + + @Test + public void givenTextAndTotalWidth_whenUsingStringUtilsCenterMethod_thenTextIsCentered() { + String text = "Centered Text"; + int width = 20; + String centeredText = StringUtils.center(text, width); + String expectedCenteredText = StringUtils.center("Centered Text", width); + assertEquals("Centered Text", expectedCenteredText, centeredText); + } + +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 5b37db6e1a..5cae60bc2a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -178,6 +178,7 @@ core-java-string-operations core-java-string-operations-2 core-java-string-operations-6 + core-java-string-operations-7 core-java-regex core-java-regex-2 core-java-uuid From 6d4e6886b311ffe28794033bc555e80b274fe40b Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 18:42:20 -0400 Subject: [PATCH 129/831] Renamed Inser position to patition key --- .../ordering/ExtSeqWithTimeWindowConsumer.java | 2 +- .../ordering/ExtSeqWithTimeWindowProducer.java | 6 ++---- .../message/ordering/MultiPartitionConsumer.java | 2 +- .../message/ordering/MultiPartitionProducer.java | 4 ++-- .../message/ordering/SinglePartitionConsumer.java | 3 +-- .../message/ordering/SinglePartitionProducer.java | 5 ++--- .../kafka/message/ordering/payload/Message.java | 14 +++++++------- .../message/ordering/MultiplePartitionTest.java | 2 +- .../message/ordering/SinglePartitionTest.java | 2 +- 9 files changed, 18 insertions(+), 22 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index f5a0dbd640..d342c1a950 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -42,7 +42,7 @@ public class ExtSeqWithTimeWindowConsumer { private static void processBuffer(List buffer) { Collections.sort(buffer); buffer.forEach(message -> { - System.out.println("Processing message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Processing message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index 110015de25..d1480522e5 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -8,8 +8,6 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; -import java.util.Random; -import java.util.concurrent.atomic.AtomicLong; public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { @@ -22,9 +20,9 @@ public class ExtSeqWithTimeWindowProducer { for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { long messageId = Message.getRandomMessageId(); String key = "Key-" + insertPosition; - Message message = new Message(insertPosition, messageId); + Message message = new Message(key, messageId); producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); } producer.close(); System.out.println("ExternalSequencingProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java index 542a664745..4471070f0f 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -29,7 +29,7 @@ public class MultiPartitionConsumer { records.forEach(record -> { Message message = record.value(); if (message != null) { - System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Process message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); } }); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index bf9db58392..04e3dcce0a 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -20,9 +20,9 @@ public class MultiPartitionProducer { for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { long messageId = Message.getRandomMessageId(); String key = "Key-" + insertPosition; - Message message = new Message(insertPosition, messageId); + Message message = new Message(key, messageId); producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java index e1a449055e..b47e4ca3b0 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -7,7 +7,6 @@ import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.StringDeserializer; -import org.apache.kafka.common.serialization.StringSerializer; import java.time.Duration; import java.util.Collections; @@ -30,7 +29,7 @@ public class SinglePartitionConsumer { ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { Message message = record.value(); - System.out.println("Process message with Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Process message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); }); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index c986089841..d669a0fd69 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -8,7 +8,6 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringSerializer; import java.util.Properties; -import java.util.Random; public class SinglePartitionProducer { public static void main(String[] args) { @@ -21,9 +20,9 @@ public class SinglePartitionProducer { for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { long messageId = Message.getRandomMessageId(); String key = "Key-" + insertPosition; - Message message = new Message(insertPosition, messageId); + Message message = new Message(key, messageId); producer.send(new ProducerRecord<>("single_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getInsertPosition() + ", Message Id: " + message.getMessageId()); + System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java index 095aeef89a..de1e5135da 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -1,11 +1,11 @@ package com.baeldung.kafka.message.ordering.payload; -import javax.swing.*; +import java.util.Objects; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; public class Message implements Comparable { - private long insertPosition; + private String partitionKey; private long messageId; public Message(){ @@ -13,13 +13,13 @@ public class Message implements Comparable { } //Required for Kafka Serialization and Deserialization - public Message(long insertPosition, long messageId) { - this.insertPosition = insertPosition; + public Message(String partitionKey, long messageId) { + this.partitionKey = partitionKey; this.messageId = messageId; } - public long getInsertPosition() { - return insertPosition; + public String getPartitionKey() { + return partitionKey; } public long getMessageId() { @@ -40,7 +40,7 @@ public class Message implements Comparable { return false; } Message message = (Message) obj; - return this.messageId == message.getMessageId() && this.insertPosition == message.getInsertPosition(); + return this.messageId == message.getMessageId() && Objects.equals(this.partitionKey, message.getPartitionKey()); } public static long getRandomMessageId() { diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java index 5b68544f95..aed5f30e9d 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java @@ -90,7 +90,7 @@ public class MultiplePartitionTest { for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { long messageId = Message.getRandomMessageId(); String key = "Key-" + insertPosition; - Message message = new Message(insertPosition, messageId); + Message message = new Message(key, messageId); Future future = producer.send(new ProducerRecord<>(TOPIC, key, message)); sentMessageList.add(message); RecordMetadata metadata = future.get(); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java index 807e21bfa8..5751c8d0e0 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java @@ -92,7 +92,7 @@ public class SinglePartitionTest { for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { long messageId = Message.getRandomMessageId(); String key = "Key-" + insertPosition; - Message message = new Message(insertPosition, messageId); + Message message = new Message(key, messageId); ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, key, message); Future future = producer.send(producerRecord); sentMessageList.add(message); From d1d456e59a6ba378c84021b26e09f05a134be131 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 19:19:01 -0400 Subject: [PATCH 130/831] Removed insertPosition, renamed messageId to applicationIdentifier --- .../ExtSeqWithTimeWindowConsumer.java | 9 ++++--- .../ExtSeqWithTimeWindowProducer.java | 18 ++++++------- .../ordering/MultiPartitionConsumer.java | 5 ++-- .../ordering/MultiPartitionProducer.java | 18 ++++++------- .../ordering/SinglePartitionConsumer.java | 9 ++++--- .../ordering/SinglePartitionProducer.java | 18 ++++++------- .../message/ordering/payload/Message.java | 20 +++++++-------- .../ordering/MultiplePartitionTest.java | 25 ++++++++----------- .../message/ordering/SinglePartitionTest.java | 23 ++++++++--------- 9 files changed, 69 insertions(+), 76 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index d342c1a950..19595d9e95 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -6,20 +6,21 @@ import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.*; public class ExtSeqWithTimeWindowConsumer { - private static final long BUFFER_PERIOD_MS = 5000; + private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); public static void main(String[] args) { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); @@ -32,7 +33,7 @@ public class ExtSeqWithTimeWindowConsumer { records.forEach(record -> { buffer.add(record.value()); }); - if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_MS) { + if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_NS) { processBuffer(buffer); lastProcessedTime = System.nanoTime(); } @@ -42,7 +43,7 @@ public class ExtSeqWithTimeWindowConsumer { private static void processBuffer(List buffer) { Collections.sort(buffer); buffer.forEach(message -> { - System.out.println("Processing message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + System.out.println("Processing message with Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index d1480522e5..a20c569159 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -5,7 +5,7 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; @@ -13,16 +13,14 @@ public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - - KafkaProducer producer = new KafkaProducer<>(props); - for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { - long messageId = Message.getRandomMessageId(); - String key = "Key-" + insertPosition; - Message message = new Message(key, messageId); - producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + producer.send(new ProducerRecord<>("multi_partition_topic", partitionKey, message)); + System.out.println("Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); } producer.close(); System.out.println("ExternalSequencingProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java index 4471070f0f..c37c645d31 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -6,6 +6,7 @@ import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; @@ -18,7 +19,7 @@ public class MultiPartitionConsumer { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); @@ -29,7 +30,7 @@ public class MultiPartitionConsumer { records.forEach(record -> { Message message = record.value(); if (message != null) { - System.out.println("Process message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + System.out.println("Process message with Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); } }); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index 04e3dcce0a..81cc5c6af0 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -5,7 +5,7 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; @@ -13,16 +13,14 @@ public class MultiPartitionProducer { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - - KafkaProducer producer = new KafkaProducer<>(props); - for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { - long messageId = Message.getRandomMessageId(); - String key = "Key-" + insertPosition; - Message message = new Message(key, messageId); - producer.send(new ProducerRecord<>("multi_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + producer.send(new ProducerRecord<>("multi_partition_topic", partitionKey, message)); + System.out.println("Partition Key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java index b47e4ca3b0..9f44cd78c6 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -6,6 +6,7 @@ import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; @@ -19,17 +20,17 @@ public class SinglePartitionConsumer { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); - Consumer consumer = new KafkaConsumer<>(props); + Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("single_partition_topic")); while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { Message message = record.value(); - System.out.println("Process message with Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + System.out.println("Process message with Partition Key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); }); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index d669a0fd69..efa6e5b93d 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -5,7 +5,7 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; @@ -13,16 +13,14 @@ public class SinglePartitionProducer { public static void main(String[] args) { Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - - KafkaProducer producer = new KafkaProducer<>(props); - for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { - long messageId = Message.getRandomMessageId(); - String key = "Key-" + insertPosition; - Message message = new Message(key, messageId); - producer.send(new ProducerRecord<>("single_partition_topic", key, message)); - System.out.println("Insert Position: " + message.getPartitionKey() + ", Message Id: " + message.getMessageId()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + producer.send(new ProducerRecord<>("single_partition_topic", partitionKey, message)); + System.out.println("Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java index de1e5135da..734ecba53d 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -5,30 +5,30 @@ import java.util.Random; import java.util.concurrent.ThreadLocalRandom; public class Message implements Comparable { - private String partitionKey; - private long messageId; + private long partitionKey; + private long applicationIdentifier; public Message(){ } //Required for Kafka Serialization and Deserialization - public Message(String partitionKey, long messageId) { + public Message(long partitionKey, long applicationIdentifier) { this.partitionKey = partitionKey; - this.messageId = messageId; + this.applicationIdentifier = applicationIdentifier; } - public String getPartitionKey() { + public long getPartitionKey() { return partitionKey; } - public long getMessageId() { - return messageId; + public long getApplicationIdentifier() { + return applicationIdentifier; } @Override public int compareTo(Message other) { - return Long.compare(this.messageId, other.messageId); + return Long.compare(this.partitionKey, other.partitionKey); } @Override @@ -40,10 +40,10 @@ public class Message implements Comparable { return false; } Message message = (Message) obj; - return this.messageId == message.getMessageId() && Objects.equals(this.partitionKey, message.getPartitionKey()); + return this.applicationIdentifier == message.getApplicationIdentifier() && Objects.equals(this.partitionKey, message.getPartitionKey()); } - public static long getRandomMessageId() { + public static long getRandomApplicationIdentifier() { Random rand = new Random(); return ThreadLocalRandom.current().nextInt(1000); } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java index aed5f30e9d..ef0a881999 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java @@ -3,7 +3,6 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.Message; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; -import lombok.var; import org.apache.kafka.clients.admin.*; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; @@ -13,9 +12,8 @@ import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.KafkaFuture; -import org.apache.kafka.common.PartitionInfo; -import org.apache.kafka.common.serialization.StringDeserializer; -import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -36,8 +34,8 @@ public class MultiplePartitionTest { private static int PARTITIONS = 5; private static short REPLICATION_FACTOR = 1; private static Admin admin; - private static KafkaProducer producer; - private static KafkaConsumer consumer; + private static KafkaProducer producer; + private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -51,12 +49,12 @@ public class MultiplePartitionTest { Properties producerProperties = new Properties(); producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); @@ -87,11 +85,10 @@ public class MultiplePartitionTest { void givenMultiplePartitions_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentMessageList = new ArrayList<>(); List receivedMessageList = new ArrayList<>(); - for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { - long messageId = Message.getRandomMessageId(); - String key = "Key-" + insertPosition; - Message message = new Message(key, messageId); - Future future = producer.send(new ProducerRecord<>(TOPIC, key, message)); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + Future future = producer.send(new ProducerRecord<>(TOPIC, partitionKey, message)); sentMessageList.add(message); RecordMetadata metadata = future.get(); System.out.println("Partition : " + metadata.partition()); @@ -99,7 +96,7 @@ public class MultiplePartitionTest { boolean isOrderMaintained = true; consumer.subscribe(Collections.singletonList(TOPIC)); - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { Message message = record.value(); receivedMessageList.add(message); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java index 5751c8d0e0..350a28e7c1 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java @@ -15,8 +15,8 @@ import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.KafkaFuture; -import org.apache.kafka.common.serialization.StringDeserializer; -import org.apache.kafka.common.serialization.StringSerializer; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -36,8 +36,8 @@ public class SinglePartitionTest { private static int PARTITIONS = 1; private static short REPLICATION_FACTOR = 1; private static Admin admin; - private static KafkaProducer producer; - private static KafkaConsumer consumer; + private static KafkaProducer producer; + private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); @@ -53,12 +53,12 @@ public class SinglePartitionTest { Properties producerProperties = new Properties(); producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); - consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); @@ -89,11 +89,10 @@ public class SinglePartitionTest { void givenASinglePartition_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentMessageList = new ArrayList<>(); List receivedMessageList = new ArrayList<>(); - for (long insertPosition = 1; insertPosition <= 10 ; insertPosition++) { - long messageId = Message.getRandomMessageId(); - String key = "Key-" + insertPosition; - Message message = new Message(key, messageId); - ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, key, message); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, partitionKey, message); Future future = producer.send(producerRecord); sentMessageList.add(message); RecordMetadata metadata = future.get(); @@ -101,7 +100,7 @@ public class SinglePartitionTest { } consumer.subscribe(Collections.singletonList(TOPIC)); - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { Message message = record.value(); receivedMessageList.add(message); From 7c40b82bf9fb27130ff0c8b97a0092616054fe7d Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 15 Oct 2023 19:30:29 -0400 Subject: [PATCH 131/831] Build Failure - Priority:3 Unit test class names need to end in UnitTest, integration tests with IntegrationTest, etc. --- ...PartitionTest.java => MultiplePartitionIntegrationTest.java} | 2 +- ...lePartitionTest.java => SinglePartitionIntegrationTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{MultiplePartitionTest.java => MultiplePartitionIntegrationTest.java} (99%) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{SinglePartitionTest.java => SinglePartitionIntegrationTest.java} (99%) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java similarity index 99% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index ef0a881999..c948effd70 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -29,7 +29,7 @@ import java.util.concurrent.Future; import static org.junit.jupiter.api.Assertions.*; @Testcontainers -public class MultiplePartitionTest { +public class MultiplePartitionIntegrationTest { private static String TOPIC = "multi_partition_topic"; private static int PARTITIONS = 5; private static short REPLICATION_FACTOR = 1; diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java similarity index 99% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 350a28e7c1..87b7d07431 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -31,7 +31,7 @@ import java.util.concurrent.Future; import static org.junit.jupiter.api.Assertions.assertTrue; @Testcontainers -public class SinglePartitionTest { +public class SinglePartitionIntegrationTest { private static String TOPIC = "single_partition_topic"; private static int PARTITIONS = 1; private static short REPLICATION_FACTOR = 1; From 825ae48e867c9fad03e920886dbaf4421ebeb53c Mon Sep 17 00:00:00 2001 From: gaepi Date: Mon, 16 Oct 2023 09:42:13 +0200 Subject: [PATCH 132/831] JAVA-25848 | renaming modules --- lightrun/{api-service => lightrun-api-service}/.gitignore | 0 lightrun/{api-service => lightrun-api-service}/pom.xml | 4 ++-- .../com/baeldung/apiservice/ApiServiceApplication.java | 0 .../java/com/baeldung/apiservice/RequestIdGenerator.java | 0 .../java/com/baeldung/apiservice/RestTemplateConfig.java | 0 .../src/main/java/com/baeldung/apiservice/WebConfig.java | 0 .../baeldung/apiservice/adapters/http/TaskResponse.java | 0 .../apiservice/adapters/http/TasksController.java | 0 .../apiservice/adapters/http/UnknownTaskException.java | 0 .../baeldung/apiservice/adapters/http/UserResponse.java | 0 .../java/com/baeldung/apiservice/adapters/tasks/Task.java | 0 .../apiservice/adapters/tasks/TaskRepository.java | 0 .../java/com/baeldung/apiservice/adapters/users/User.java | 0 .../apiservice/adapters/users/UserRepository.java | 0 .../src/main/resources/application.properties | 0 .../{tasks-service => lightrun-tasks-service}/.gitignore | 0 .../{tasks-service => lightrun-tasks-service}/pom.xml | 4 ++-- .../java/com/baeldung/tasksservice/ArtemisConfig.java | 0 .../com/baeldung/tasksservice/SimpleCacheCustomizer.java | 0 .../baeldung/tasksservice/TasksServiceApplication.java | 0 .../tasksservice/adapters/http/CreateTaskRequest.java | 0 .../tasksservice/adapters/http/PatchTaskRequest.java | 0 .../baeldung/tasksservice/adapters/http/TaskResponse.java | 0 .../tasksservice/adapters/http/TasksController.java | 0 .../tasksservice/adapters/http/http-client.env.json | 0 .../com/baeldung/tasksservice/adapters/http/tasks.http | 0 .../baeldung/tasksservice/adapters/jms/JmsConsumer.java | 0 .../tasksservice/adapters/repository/TaskRecord.java | 0 .../tasksservice/adapters/repository/TasksRepository.java | 0 .../baeldung/tasksservice/service/DeletedUserService.java | 0 .../com/baeldung/tasksservice/service/TasksService.java | 0 .../tasksservice/service/UnknownTaskException.java | 0 .../src/main/resources/application.properties | 0 .../resources/db/migration/V1_0_0__create-tasks-table.sql | 0 .../{users-service => lightrun-users-service}/.gitignore | 0 .../{users-service => lightrun-users-service}/README.md | 0 .../{users-service => lightrun-users-service}/pom.xml | 4 ++-- .../main/java/com/baeldung/usersservice/JmsConfig.java | 0 .../baeldung/usersservice/UsersServiceApplication.java | 0 .../usersservice/adapters/http/CreateUserRequest.java | 0 .../usersservice/adapters/http/PatchUserRequest.java | 0 .../baeldung/usersservice/adapters/http/UserResponse.java | 0 .../usersservice/adapters/http/UsersController.java | 0 .../usersservice/adapters/http/http-client.env.json | 0 .../com/baeldung/usersservice/adapters/http/users.http | 0 .../com/baeldung/usersservice/adapters/jms/JmsSender.java | 0 .../usersservice/adapters/repository/UserRecord.java | 0 .../usersservice/adapters/repository/UsersRepository.java | 0 .../usersservice/service/UnknownUserException.java | 0 .../com/baeldung/usersservice/service/UsersService.java | 0 .../src/main/resources/application.properties | 0 .../resources/db/migration/V1_0_0__create-users-table.sql | 0 .../pom.xml | 4 ++-- .../pom.xml | 4 ++-- .../com/baeldung/coverageaggregation/MyApplication.java | 0 .../com/baeldung/coverageaggregation/MyController.java | 0 .../coverageaggregation/MyControllerIntegrationTest.java | 0 .../pom.xml | 4 ++-- .../java/com/baeldung/coverageaggregation/MyService.java | 0 .../baeldung/coverageaggregation/MyServiceUnitTest.java | 0 maven-modules/jacoco-coverage-aggregation/pom.xml | 6 +++--- .../parent-pom-module1}/pom.xml | 4 ++-- .../parent-pom-module2/parent-pom-module3}/pom.xml | 4 ++-- .../parent-pom-module2}/pom.xml | 8 ++++---- .../{aggregator => maven-parent-pom-aggregator}/pom.xml | 7 +++---- maven-modules/maven-parent-pom-resolution/pom.xml | 2 +- 66 files changed, 27 insertions(+), 28 deletions(-) rename lightrun/{api-service => lightrun-api-service}/.gitignore (100%) rename lightrun/{api-service => lightrun-api-service}/pom.xml (93%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/WebConfig.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/users/User.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java (100%) rename lightrun/{api-service => lightrun-api-service}/src/main/resources/application.properties (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/.gitignore (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/pom.xml (95%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/service/TasksService.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/resources/application.properties (100%) rename lightrun/{tasks-service => lightrun-tasks-service}/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql (100%) rename lightrun/{users-service => lightrun-users-service}/.gitignore (100%) rename lightrun/{users-service => lightrun-users-service}/README.md (100%) rename lightrun/{users-service => lightrun-users-service}/pom.xml (95%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/JmsConfig.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/http/users.http (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/java/com/baeldung/usersservice/service/UsersService.java (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/resources/application.properties (100%) rename lightrun/{users-service => lightrun-users-service}/src/main/resources/db/migration/V1_0_0__create-users-table.sql (100%) rename maven-modules/jacoco-coverage-aggregation/{aggregate-report => jacoco-coverage-aggregate-report}/pom.xml (94%) rename maven-modules/jacoco-coverage-aggregation/{controllers => jacoco-coverage-controllers-example}/pom.xml (94%) rename maven-modules/jacoco-coverage-aggregation/{controllers => jacoco-coverage-controllers-example}/src/main/java/com/baeldung/coverageaggregation/MyApplication.java (100%) rename maven-modules/jacoco-coverage-aggregation/{controllers => jacoco-coverage-controllers-example}/src/main/java/com/baeldung/coverageaggregation/MyController.java (100%) rename maven-modules/jacoco-coverage-aggregation/{controllers => jacoco-coverage-controllers-example}/src/test/java/com/baeldung/coverageaggregation/MyControllerIntegrationTest.java (100%) rename maven-modules/jacoco-coverage-aggregation/{services => jacoco-coverage-services-example}/pom.xml (93%) rename maven-modules/jacoco-coverage-aggregation/{services => jacoco-coverage-services-example}/src/main/java/com/baeldung/coverageaggregation/MyService.java (100%) rename maven-modules/jacoco-coverage-aggregation/{services => jacoco-coverage-services-example}/src/test/java/com/baeldung/coverageaggregation/MyServiceUnitTest.java (100%) rename maven-modules/maven-parent-pom-resolution/{aggregator/module1 => maven-parent-pom-aggregator/parent-pom-module1}/pom.xml (81%) rename maven-modules/maven-parent-pom-resolution/{aggregator/module2/module3 => maven-parent-pom-aggregator/parent-pom-module2/parent-pom-module3}/pom.xml (85%) rename maven-modules/maven-parent-pom-resolution/{aggregator/module2 => maven-parent-pom-aggregator/parent-pom-module2}/pom.xml (71%) rename maven-modules/maven-parent-pom-resolution/{aggregator => maven-parent-pom-aggregator}/pom.xml (77%) diff --git a/lightrun/api-service/.gitignore b/lightrun/lightrun-api-service/.gitignore similarity index 100% rename from lightrun/api-service/.gitignore rename to lightrun/lightrun-api-service/.gitignore diff --git a/lightrun/api-service/pom.xml b/lightrun/lightrun-api-service/pom.xml similarity index 93% rename from lightrun/api-service/pom.xml rename to lightrun/lightrun-api-service/pom.xml index f44ad07edb..b7ed5f951b 100644 --- a/lightrun/api-service/pom.xml +++ b/lightrun/lightrun-api-service/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - api-service + lightrun-api-service 0.0.1-SNAPSHOT - api-service + lightrun-api-service Aggregator Service for LightRun Article diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/ApiServiceApplication.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/RequestIdGenerator.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/RestTemplateConfig.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/WebConfig.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/WebConfig.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/WebConfig.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/TaskResponse.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/TasksController.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/UnknownTaskException.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/http/UserResponse.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/Task.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/tasks/TaskRepository.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/users/User.java diff --git a/lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java b/lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java similarity index 100% rename from lightrun/api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java rename to lightrun/lightrun-api-service/src/main/java/com/baeldung/apiservice/adapters/users/UserRepository.java diff --git a/lightrun/api-service/src/main/resources/application.properties b/lightrun/lightrun-api-service/src/main/resources/application.properties similarity index 100% rename from lightrun/api-service/src/main/resources/application.properties rename to lightrun/lightrun-api-service/src/main/resources/application.properties diff --git a/lightrun/tasks-service/.gitignore b/lightrun/lightrun-tasks-service/.gitignore similarity index 100% rename from lightrun/tasks-service/.gitignore rename to lightrun/lightrun-tasks-service/.gitignore diff --git a/lightrun/tasks-service/pom.xml b/lightrun/lightrun-tasks-service/pom.xml similarity index 95% rename from lightrun/tasks-service/pom.xml rename to lightrun/lightrun-tasks-service/pom.xml index c3542b0089..2689a9794d 100644 --- a/lightrun/tasks-service/pom.xml +++ b/lightrun/lightrun-tasks-service/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - tasks-service + lightrun-tasks-service 0.0.1-SNAPSHOT - tasks-service + lightrun-tasks-service Tasks Service for LightRun Article diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/ArtemisConfig.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/SimpleCacheCustomizer.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/TasksServiceApplication.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/CreateTaskRequest.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/PatchTaskRequest.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TaskResponse.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/TasksController.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/http-client.env.json diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/http/tasks.http diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/jms/JmsConsumer.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TaskRecord.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/adapters/repository/TasksRepository.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/DeletedUserService.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/TasksService.java diff --git a/lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java b/lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java similarity index 100% rename from lightrun/tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java rename to lightrun/lightrun-tasks-service/src/main/java/com/baeldung/tasksservice/service/UnknownTaskException.java diff --git a/lightrun/tasks-service/src/main/resources/application.properties b/lightrun/lightrun-tasks-service/src/main/resources/application.properties similarity index 100% rename from lightrun/tasks-service/src/main/resources/application.properties rename to lightrun/lightrun-tasks-service/src/main/resources/application.properties diff --git a/lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql b/lightrun/lightrun-tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql similarity index 100% rename from lightrun/tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql rename to lightrun/lightrun-tasks-service/src/main/resources/db/migration/V1_0_0__create-tasks-table.sql diff --git a/lightrun/users-service/.gitignore b/lightrun/lightrun-users-service/.gitignore similarity index 100% rename from lightrun/users-service/.gitignore rename to lightrun/lightrun-users-service/.gitignore diff --git a/lightrun/users-service/README.md b/lightrun/lightrun-users-service/README.md similarity index 100% rename from lightrun/users-service/README.md rename to lightrun/lightrun-users-service/README.md diff --git a/lightrun/users-service/pom.xml b/lightrun/lightrun-users-service/pom.xml similarity index 95% rename from lightrun/users-service/pom.xml rename to lightrun/lightrun-users-service/pom.xml index 9560dcf23b..40594db725 100644 --- a/lightrun/users-service/pom.xml +++ b/lightrun/lightrun-users-service/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - users-service + lightrun-users-service 0.0.1-SNAPSHOT - users-service + lightrun-users-service Users Service for LightRun Article diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/JmsConfig.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/UsersServiceApplication.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/CreateUserRequest.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/PatchUserRequest.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/UserResponse.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/UsersController.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/http-client.env.json diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/http/users.http diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/jms/JmsSender.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UserRecord.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/adapters/repository/UsersRepository.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/service/UnknownUserException.java diff --git a/lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java b/lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java similarity index 100% rename from lightrun/users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java rename to lightrun/lightrun-users-service/src/main/java/com/baeldung/usersservice/service/UsersService.java diff --git a/lightrun/users-service/src/main/resources/application.properties b/lightrun/lightrun-users-service/src/main/resources/application.properties similarity index 100% rename from lightrun/users-service/src/main/resources/application.properties rename to lightrun/lightrun-users-service/src/main/resources/application.properties diff --git a/lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql b/lightrun/lightrun-users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql similarity index 100% rename from lightrun/users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql rename to lightrun/lightrun-users-service/src/main/resources/db/migration/V1_0_0__create-users-table.sql diff --git a/maven-modules/jacoco-coverage-aggregation/aggregate-report/pom.xml b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-aggregate-report/pom.xml similarity index 94% rename from maven-modules/jacoco-coverage-aggregation/aggregate-report/pom.xml rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-aggregate-report/pom.xml index 1a076cacae..627a9f3206 100644 --- a/maven-modules/jacoco-coverage-aggregation/aggregate-report/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-aggregate-report/pom.xml @@ -4,8 +4,8 @@ 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.jacoco-coverage-aggregation - aggregate-report - aggregate-report + jacoco-coverage-aggregate-report + jacoco-coverage-aggregate-report pom diff --git a/maven-modules/jacoco-coverage-aggregation/controllers/pom.xml b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/pom.xml similarity index 94% rename from maven-modules/jacoco-coverage-aggregation/controllers/pom.xml rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/pom.xml index 5aa54f042f..886e931224 100644 --- a/maven-modules/jacoco-coverage-aggregation/controllers/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/pom.xml @@ -4,8 +4,8 @@ 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.jacoco-coverage-aggregation - controllers - controllers + jacoco-coverage-controllers-example + jacoco-coverage-controllers-example jar diff --git a/maven-modules/jacoco-coverage-aggregation/controllers/src/main/java/com/baeldung/coverageaggregation/MyApplication.java b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/main/java/com/baeldung/coverageaggregation/MyApplication.java similarity index 100% rename from maven-modules/jacoco-coverage-aggregation/controllers/src/main/java/com/baeldung/coverageaggregation/MyApplication.java rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/main/java/com/baeldung/coverageaggregation/MyApplication.java diff --git a/maven-modules/jacoco-coverage-aggregation/controllers/src/main/java/com/baeldung/coverageaggregation/MyController.java b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/main/java/com/baeldung/coverageaggregation/MyController.java similarity index 100% rename from maven-modules/jacoco-coverage-aggregation/controllers/src/main/java/com/baeldung/coverageaggregation/MyController.java rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/main/java/com/baeldung/coverageaggregation/MyController.java diff --git a/maven-modules/jacoco-coverage-aggregation/controllers/src/test/java/com/baeldung/coverageaggregation/MyControllerIntegrationTest.java b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/test/java/com/baeldung/coverageaggregation/MyControllerIntegrationTest.java similarity index 100% rename from maven-modules/jacoco-coverage-aggregation/controllers/src/test/java/com/baeldung/coverageaggregation/MyControllerIntegrationTest.java rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-controllers-example/src/test/java/com/baeldung/coverageaggregation/MyControllerIntegrationTest.java diff --git a/maven-modules/jacoco-coverage-aggregation/services/pom.xml b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml similarity index 93% rename from maven-modules/jacoco-coverage-aggregation/services/pom.xml rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml index 50c8c87f54..2c06694b46 100644 --- a/maven-modules/jacoco-coverage-aggregation/services/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml @@ -4,8 +4,8 @@ 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.jacoco-coverage-aggregation - services - services + jacoco-coverage-services-example + jacoco-coverage-services-example jar diff --git a/maven-modules/jacoco-coverage-aggregation/services/src/main/java/com/baeldung/coverageaggregation/MyService.java b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/src/main/java/com/baeldung/coverageaggregation/MyService.java similarity index 100% rename from maven-modules/jacoco-coverage-aggregation/services/src/main/java/com/baeldung/coverageaggregation/MyService.java rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/src/main/java/com/baeldung/coverageaggregation/MyService.java diff --git a/maven-modules/jacoco-coverage-aggregation/services/src/test/java/com/baeldung/coverageaggregation/MyServiceUnitTest.java b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/src/test/java/com/baeldung/coverageaggregation/MyServiceUnitTest.java similarity index 100% rename from maven-modules/jacoco-coverage-aggregation/services/src/test/java/com/baeldung/coverageaggregation/MyServiceUnitTest.java rename to maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/src/test/java/com/baeldung/coverageaggregation/MyServiceUnitTest.java diff --git a/maven-modules/jacoco-coverage-aggregation/pom.xml b/maven-modules/jacoco-coverage-aggregation/pom.xml index d85f41968d..70243973e8 100644 --- a/maven-modules/jacoco-coverage-aggregation/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/pom.xml @@ -17,9 +17,9 @@ - services - controllers - aggregate-report + jacoco-coverage-services-example + jacoco-coverage-controllers-example + jacoco-coverage-aggregate-report diff --git a/maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module1/pom.xml similarity index 81% rename from maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml rename to maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module1/pom.xml index 67e60fb386..94164b472c 100644 --- a/maven-modules/maven-parent-pom-resolution/aggregator/module1/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module1/pom.xml @@ -3,12 +3,12 @@ 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 - module1 + parent-pom-module1 pom com.baeldung.maven-parent-pom-resolution - aggregator + maven-parent-pom-aggregator 1.0.0-SNAPSHOT diff --git a/maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/parent-pom-module3/pom.xml similarity index 85% rename from maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml rename to maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/parent-pom-module3/pom.xml index f4e3e81e7d..533157d621 100644 --- a/maven-modules/maven-parent-pom-resolution/aggregator/module2/module3/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/parent-pom-module3/pom.xml @@ -3,12 +3,12 @@ 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 - module3 + parent-pom-module3 pom com.baeldung.maven-parent-pom-resolution - aggregator + maven-parent-pom-aggregator 1.0.0-SNAPSHOT diff --git a/maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/pom.xml similarity index 71% rename from maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml rename to maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/pom.xml index 9b36ef37fb..9cb4407125 100644 --- a/maven-modules/maven-parent-pom-resolution/aggregator/module2/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/parent-pom-module2/pom.xml @@ -3,19 +3,19 @@ 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 - module2 + parent-pom-module2 pom com.baeldung.maven-parent-pom-resolution - module1 + parent-pom-module1 1.0.0-SNAPSHOT - ../module1/pom.xml + ../parent-pom-module1/pom.xml - module3 + parent-pom-module3 \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/aggregator/pom.xml b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/pom.xml similarity index 77% rename from maven-modules/maven-parent-pom-resolution/aggregator/pom.xml rename to maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/pom.xml index dde2c46370..8e3a922e76 100644 --- a/maven-modules/maven-parent-pom-resolution/aggregator/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/maven-parent-pom-aggregator/pom.xml @@ -4,19 +4,18 @@ 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.maven-parent-pom-resolution - aggregator + maven-parent-pom-aggregator pom com.baeldung maven-parent-pom-resolution 1.0.0-SNAPSHOT - - module1 - module2 + parent-pom-module1 + parent-pom-module2 \ No newline at end of file diff --git a/maven-modules/maven-parent-pom-resolution/pom.xml b/maven-modules/maven-parent-pom-resolution/pom.xml index 288bf5f780..fa3ca3dc9a 100644 --- a/maven-modules/maven-parent-pom-resolution/pom.xml +++ b/maven-modules/maven-parent-pom-resolution/pom.xml @@ -9,7 +9,7 @@ pom - aggregator + maven-parent-pom-aggregator disable-plugin-examples From b0dc3b228a9e184c4bd544980c26a431d20d05e4 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Mon, 16 Oct 2023 15:16:22 +0530 Subject: [PATCH 133/831] =?UTF-8?q?JAVA-25374:=20Fixes=20made=20for=20inte?= =?UTF-8?q?gration=20test=20failure=20in=20spring-kafka-2=E2=80=A6=20(#148?= =?UTF-8?q?64)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++++ spring-kafka-2/src/main/resources/application.properties | 2 +- .../KafkaMultipleListenersIntegrationTest.java | 2 +- .../spring/kafka/retryable/KafkaRetryableIntegrationTest.java | 2 +- .../KafkaTopicsAndPartitionsIntegrationTest.java | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 5d8358f05e..e3a94e7223 100644 --- a/pom.xml +++ b/pom.xml @@ -942,6 +942,7 @@ gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j parent-boot-3 + spring-kafka-2 @@ -1225,6 +1226,9 @@ gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j spring-actuator + spring-cloud-modules/spring-cloud-contract + spring-kafka-2 + diff --git a/spring-kafka-2/src/main/resources/application.properties b/spring-kafka-2/src/main/resources/application.properties index 4725ace2d9..ed844cadf8 100644 --- a/spring-kafka-2/src/main/resources/application.properties +++ b/spring-kafka-2/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.kafka.bootstrap-servers=localhost:9092 +spring.kafka.bootstrap-servers=localhost:9092,localhost:9093,localhost:9094 message.topic.name=baeldung long.message.topic.name=longMessage greeting.topic.name=greeting diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multiplelisteners/KafkaMultipleListenersIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multiplelisteners/KafkaMultipleListenersIntegrationTest.java index b6634ec7ed..9dfebb104e 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multiplelisteners/KafkaMultipleListenersIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multiplelisteners/KafkaMultipleListenersIntegrationTest.java @@ -19,7 +19,7 @@ import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; import org.springframework.kafka.test.context.EmbeddedKafka; @SpringBootTest(classes = MultipleListenersApplicationKafkaApp.class) -@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +@EmbeddedKafka(partitions = 1, controlledShutdown = true, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) class KafkaMultipleListenersIntegrationTest { @Autowired diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/retryable/KafkaRetryableIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/retryable/KafkaRetryableIntegrationTest.java index 52cda85f90..daec8232bf 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/retryable/KafkaRetryableIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/retryable/KafkaRetryableIntegrationTest.java @@ -22,7 +22,7 @@ import com.baeldung.spring.kafka.retryable.RetryableApplicationKafkaApp; import com.fasterxml.jackson.databind.ObjectMapper; @SpringBootTest(classes = RetryableApplicationKafkaApp.class) -@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +@EmbeddedKafka(partitions = 1, controlledShutdown = true, brokerProperties = { "listeners=PLAINTEXT://localhost:9093", "port=9093" }) public class KafkaRetryableIntegrationTest { @ClassRule public static EmbeddedKafkaBroker embeddedKafka = new EmbeddedKafkaBroker(1, true, "multitype"); diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/topicsandpartitions/KafkaTopicsAndPartitionsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/topicsandpartitions/KafkaTopicsAndPartitionsIntegrationTest.java index de720ef955..4413239c78 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/topicsandpartitions/KafkaTopicsAndPartitionsIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/topicsandpartitions/KafkaTopicsAndPartitionsIntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.kafka.test.EmbeddedKafkaBroker; import org.springframework.kafka.test.context.EmbeddedKafka; @SpringBootTest(classes = ThermostatApplicationKafkaApp.class) -@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9092", "port=9092"}) +@EmbeddedKafka(partitions = 2, controlledShutdown = true, brokerProperties = {"listeners=PLAINTEXT://localhost:9094", "port=9094"}) public class KafkaTopicsAndPartitionsIntegrationTest { @ClassRule public static EmbeddedKafkaBroker embeddedKafka = new EmbeddedKafkaBroker(1, true, "multitype"); From 6d7040879b4d5b434613d214212e70bf78703415 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:52:33 +0300 Subject: [PATCH 134/831] [JAVA-4584] Enabled core-java-12 module (#14926) Enabled 12,13,15 --- core-java-modules/core-java-12/pom.xml | 30 +++------------- .../switchExpression/SwitchUnitTest.java | 13 ------- core-java-modules/core-java-13/pom.xml | 34 +++---------------- .../SwitchExpressionsWithYieldUnitTest.java | 1 - .../newfeatures/TextBlocksUnitTest.java | 2 -- .../SwitchExpressionsUnitTest.java | 4 --- core-java-modules/core-java-15/pom.xml | 34 +++---------------- core-java-modules/pom.xml | 3 ++ pom.xml | 6 ---- 9 files changed, 15 insertions(+), 112 deletions(-) diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml index ba6dfc62bc..8165549d8c 100644 --- a/core-java-modules/core-java-12/pom.xml +++ b/core-java-modules/core-java-12/pom.xml @@ -8,9 +8,9 @@ jar - com.baeldung - parent-modules - 1.0.0-SNAPSHOT + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT @@ -21,30 +21,8 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source.version} - ${maven.compiler.target.version} - --enable-preview - - - - maven-surefire-plugin - - --enable-preview - - - - - - 12 - 12 + 17 \ No newline at end of file diff --git a/core-java-modules/core-java-12/src/test/java/com/baeldung/switchExpression/SwitchUnitTest.java b/core-java-modules/core-java-12/src/test/java/com/baeldung/switchExpression/SwitchUnitTest.java index 708e416090..994c6d9a73 100644 --- a/core-java-modules/core-java-12/src/test/java/com/baeldung/switchExpression/SwitchUnitTest.java +++ b/core-java-modules/core-java-12/src/test/java/com/baeldung/switchExpression/SwitchUnitTest.java @@ -19,19 +19,6 @@ public class SwitchUnitTest { Assert.assertEquals(value, 2); } - @Test - public void switchLocalVariable(){ - var month = Month.AUG; - int i = switch (month){ - case JAN,JUN, JUL -> 3; - case FEB,SEP, OCT, NOV, DEC -> 1; - case MAR,MAY, APR, AUG -> { - int j = month.toString().length() * 4; - break j; - } - }; - Assert.assertEquals(12, i); - } enum Month {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC} } diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml index 11d6ee7007..52cf227583 100644 --- a/core-java-modules/core-java-13/pom.xml +++ b/core-java-modules/core-java-13/pom.xml @@ -8,39 +8,13 @@ jar - com.baeldung - parent-modules - 1.0.0-SNAPSHOT + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.source.version} - ${maven.compiler.target.version} - 13 - --enable-preview - - - - org.apache.maven.plugins - maven-surefire-plugin - ${surefire.plugin.version} - - --enable-preview - - - - - - 13 - 13 - 3.0.0-M3 + 17 \ No newline at end of file diff --git a/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/SwitchExpressionsWithYieldUnitTest.java b/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/SwitchExpressionsWithYieldUnitTest.java index be1fcfd167..3d3f319218 100644 --- a/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/SwitchExpressionsWithYieldUnitTest.java +++ b/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/SwitchExpressionsWithYieldUnitTest.java @@ -7,7 +7,6 @@ import org.junit.Test; public class SwitchExpressionsWithYieldUnitTest { @Test - @SuppressWarnings("preview") public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() { var me = 4; var operation = "squareMe"; diff --git a/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/TextBlocksUnitTest.java b/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/TextBlocksUnitTest.java index 1f8ddcbfb4..e028e5f02c 100644 --- a/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/TextBlocksUnitTest.java +++ b/core-java-modules/core-java-13/src/test/java/com/baeldung/newfeatures/TextBlocksUnitTest.java @@ -8,7 +8,6 @@ public class TextBlocksUnitTest { private static final String JSON_STRING = "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : \"https://www.%s.com/\"\r\n" + "}"; - @SuppressWarnings("preview") private static final String TEXT_BLOCK_JSON = """ { "name" : "Baeldung", @@ -25,7 +24,6 @@ public class TextBlocksUnitTest { } - @SuppressWarnings("removal") @Test public void whenTextBlocks_thenFormattedWorksAsFormat() { assertThat(TEXT_BLOCK_JSON.formatted("baeldung") diff --git a/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java index bb9250f000..04aea79a67 100644 --- a/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java +++ b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java @@ -13,7 +13,6 @@ import org.junit.Test; public class SwitchExpressionsUnitTest { @Test - @SuppressWarnings ("preview") public void whenSwitchingOverMonthJune_thenWillReturn3() { var month = JUNE; @@ -29,7 +28,6 @@ public class SwitchExpressionsUnitTest { } @Test - @SuppressWarnings ("preview") public void whenSwitchingOverMonthAugust_thenWillReturn24() { var month = AUGUST; @@ -47,7 +45,6 @@ public class SwitchExpressionsUnitTest { } @Test - @SuppressWarnings ("preview") public void whenSwitchingOverMonthJanuary_thenWillReturn3() { Function func = (month) -> { @@ -61,7 +58,6 @@ public class SwitchExpressionsUnitTest { } @Test - @SuppressWarnings ("preview") public void whenSwitchingOverMonthAugust_thenWillReturn2() { var month = AUGUST; diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml index 3ac45d26ba..3996c69fa4 100644 --- a/core-java-modules/core-java-15/pom.xml +++ b/core-java-modules/core-java-15/pom.xml @@ -8,10 +8,9 @@ jar - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../pom.xml + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT @@ -27,33 +26,8 @@ - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${maven.compiler.release} - --enable-preview - 14 - 14 - - - - org.apache.maven.plugins - maven-surefire-plugin - ${surefire.plugin.version} - - --enable-preview - - - - - - 15 - 3.0.0-M3 + 17 \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 5cae60bc2a..8cfd67aed3 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -34,6 +34,9 @@ core-java-11 core-java-11-2 core-java-11-3 + core-java-12 + core-java-13 + core-java-15 core-java-collections-array-list core-java-collections-array-list-2 core-java-collections-list-4 diff --git a/pom.xml b/pom.xml index e3a94e7223..91e0c54784 100644 --- a/pom.xml +++ b/pom.xml @@ -770,10 +770,7 @@ core-java-modules - - - @@ -1051,10 +1048,7 @@ core-java-modules gcp-firebase - - - From f2e154792017aba1ccc67835f584b2190e88738d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:22:06 +0300 Subject: [PATCH 135/831] [JAVA-26046] Upgraded spring-scheduling to spring boot 3 (#14939) --- spring-scheduling/pom.xml | 16 +++++++--------- .../dynamic/DynamicSchedulingConfig.java | 2 +- .../ThreadPoolTaskSchedulerExamples.java | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/spring-scheduling/pom.xml b/spring-scheduling/pom.xml index 9010338fee..e374b2b890 100644 --- a/spring-scheduling/pom.xml +++ b/spring-scheduling/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 @@ -33,21 +33,19 @@ org.springframework.boot spring-boot-starter-web - - javax.annotation - javax.annotation-api - ${annotation-api.version} - org.springframework spring-test test + + org.apache.commons + commons-lang3 + - 2.0.0 - 1.3.2 + 2.0.3 \ No newline at end of file diff --git a/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java index b29f9ab0ce..7b7c18f507 100644 --- a/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java +++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java @@ -37,7 +37,7 @@ public class DynamicSchedulingConfig implements SchedulingConfigurer { Instant nextExecutionTime = lastCompletionTime.orElseGet(Date::new).toInstant() .plusMillis(tickService.getDelay()); - return Date.from(nextExecutionTime); + return Date.from(nextExecutionTime).toInstant(); } ); } diff --git a/spring-scheduling/src/main/java/com/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java b/spring-scheduling/src/main/java/com/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java index c0c6f37507..163be62591 100644 --- a/spring-scheduling/src/main/java/com/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java +++ b/spring-scheduling/src/main/java/com/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java @@ -2,7 +2,7 @@ package com.baeldung.taskscheduler; import java.util.Date; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; From 7e924cefe4a2bb82bd54100095ed2e486e238196 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Mon, 16 Oct 2023 17:31:19 +0700 Subject: [PATCH 136/831] [update] method name, result, flow --- .../CompletableFutureTimeoutUnitTest.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 8070ef620a..a332f816b2 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -7,7 +7,9 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.*; @@ -21,18 +23,19 @@ class CompletableFutureTimeoutUnitTest { private WireMockServer wireMockServer; private ScheduledExecutorService executorService; private static final int DEFAULT_TIMEOUT = 1000; //1 seconds - private static final int TIMEOUT_STATUS_CODE = 408; //0.5 seconds + private static final String DEFAULT_PRODUCT = "default_product"; + private static final String PRODUCT_OFFERS = "product_offers"; @BeforeAll void setUp() { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); - + System.out.println("stubing"); stubFor(get(urlEqualTo("/api/dummy")) .willReturn(aResponse() .withFixedDelay(5000) // must be > DEFAULT_TIMEOUT for a timeout to occur. - .withStatus(408))); + .withBody(PRODUCT_OFFERS))); executorService = Executors.newScheduledThreadPool(1); } @@ -44,39 +47,47 @@ class CompletableFutureTimeoutUnitTest { wireMockServer.stop(); } - private CompletableFuture createDummyRequest() { + private CompletableFuture fetchProductData() { return CompletableFuture.supplyAsync(() -> { try { URL url = new URL("http://localhost:8080/api/dummy"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); try { - return connection.getResponseCode(); + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + return response.toString(); } finally { connection.disconnect(); } - } catch (Exception e) { - return TIMEOUT_STATUS_CODE; + } catch (IOException e) { + return ""; } }); } @Test void whenorTimeout_thenGetThrow() { - CompletableFuture completableFuture = createDummyRequest(); + CompletableFuture completableFuture = fetchProductData(); completableFuture.orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); assertThrows(ExecutionException.class, completableFuture::get); } @Test void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { - CompletableFuture completableFuture = createDummyRequest(); - completableFuture.completeOnTimeout(TIMEOUT_STATUS_CODE, DEFAULT_TIMEOUT,TimeUnit.MILLISECONDS); - assertEquals(TIMEOUT_STATUS_CODE, completableFuture.get()); + CompletableFuture completableFuture = fetchProductData(); + completableFuture.completeOnTimeout(DEFAULT_PRODUCT, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + assertEquals(DEFAULT_PRODUCT, completableFuture.get()); } @Test void whencompleteExceptionally_thenGetThrow() { - CompletableFuture completableFuture = createDummyRequest(); + CompletableFuture completableFuture = fetchProductData(); executorService.schedule(() -> completableFuture .completeExceptionally(new TimeoutException("Timeout occurred")), DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); assertThrows(ExecutionException.class, completableFuture::get); From c1f53973cd2ae694d7c672fb5f105bea888c31cc Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Mon, 16 Oct 2023 18:33:15 +0700 Subject: [PATCH 137/831] [Update] clean trash --- .../completablefuture/CompletableFutureTimeoutUnitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index a332f816b2..c1de38ad37 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -31,7 +31,7 @@ class CompletableFutureTimeoutUnitTest { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); - System.out.println("stubing"); + stubFor(get(urlEqualTo("/api/dummy")) .willReturn(aResponse() .withFixedDelay(5000) // must be > DEFAULT_TIMEOUT for a timeout to occur. @@ -61,6 +61,7 @@ class CompletableFutureTimeoutUnitTest { response.append(inputLine); } in.close(); + return response.toString(); } finally { connection.disconnect(); From 97403b833c49d2a926b4ae69be995b4bd8288084 Mon Sep 17 00:00:00 2001 From: gaepi Date: Mon, 16 Oct 2023 17:00:00 +0200 Subject: [PATCH 138/831] JAVA-25848 | fixed parent include --- lightrun/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lightrun/pom.xml b/lightrun/pom.xml index 3fcec48cbd..78534922f6 100644 --- a/lightrun/pom.xml +++ b/lightrun/pom.xml @@ -18,9 +18,9 @@ - tasks-service - users-service - api-service + lightrun-tasks-service + lightrun-users-service + lightrun-api-service \ No newline at end of file From 5d6e1a21ff375ae793cf754e77e5c47ad384ab70 Mon Sep 17 00:00:00 2001 From: Mikhail Polivakha <68962645+Mikhail2048@users.noreply.github.com> Date: Mon, 16 Oct 2023 19:38:35 +0300 Subject: [PATCH 139/831] BAEL-7022 (#14984) * BAEL-6706 source code * BAEL-7022 implemented --- .../core-java-concurrency-advanced-5/pom.xml | 36 +++++++++++++++++++ .../ConditionChecker.java | 24 +++++++++++++ .../ConditionCheckerUnitTest.java | 22 ++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-5/pom.xml create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/wait_synchronization/ConditionCheckerUnitTest.java diff --git a/core-java-modules/core-java-concurrency-advanced-5/pom.xml b/core-java-modules/core-java-concurrency-advanced-5/pom.xml new file mode 100644 index 0000000000..b84d3810bb --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/pom.xml @@ -0,0 +1,36 @@ + + + + 4.0.0 + core-java-concurrency-advanced-5 + core-java-concurrency-advanced-5 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + core-java-concurrency-advanced-5 + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 1.8 + 1.8 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java new file mode 100644 index 0000000000..dca36fe7cb --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java @@ -0,0 +1,24 @@ +package com.baeldung.wait_synchronization; + +public class ConditionChecker { + + private volatile Boolean jobIsDone; + private final Object lock = new Object(); + + public void ensureCondition() { + synchronized (lock) { + while (!jobIsDone) { + try { + lock.wait(); + } catch (InterruptedException e) { } + } + } + } + + public void complete() { + synchronized (lock) { + jobIsDone = true; + lock.notify(); + } + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/wait_synchronization/ConditionCheckerUnitTest.java b/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/wait_synchronization/ConditionCheckerUnitTest.java new file mode 100644 index 0000000000..2698640e6a --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/wait_synchronization/ConditionCheckerUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.wait_synchronization; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class ConditionCheckerUnitTest { + + @Test + public void givenBothMethodsAreSynchronized_whenBothMethodsAreCalled_thenNoExceptionsOrDeadlocks() { + ConditionChecker conditionChecker = new ConditionChecker(); + + ExecutorService executorService = Executors.newFixedThreadPool(2); + + Assertions.assertThatCode(() -> { + executorService.submit(conditionChecker::ensureCondition); + executorService.submit(conditionChecker::complete); + }).doesNotThrowAnyException(); + } +} \ No newline at end of file From 459d92fae64464fdfc450a4d73f7a2558eec228f Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 16 Oct 2023 22:57:25 +0300 Subject: [PATCH 140/831] [JAVA-25997] Fixed typo --- spring-kafka-2/pom.xml | 2 +- spring-vault/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index 2aa657d3d8..0bca20447d 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -65,7 +65,7 @@ 1.16.2 - 1.16.2 + 1.16.2 \ No newline at end of file diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index dba6a02e4e..e8257125bc 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -80,7 +80,7 @@ - 2.3.4 + 2.3.4 2.20.140 3.1.3 17 From baaef6bcf3599c79d90cf8e6fc9f96df59c47e4d Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Mon, 16 Oct 2023 19:50:02 -0400 Subject: [PATCH 141/831] Added tests for External Sequence number with Time Window --- .../ExtSeqWithTimeWindowConsumer.java | 6 +- .../ExtSeqWithTimeWindowProducer.java | 1 + .../message/ordering/payload/Message.java | 12 +- .../ExtSeqWithTimeWindowIntegrationTest.java | 138 ++++++++++++++++++ 4 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index 19595d9e95..cd424178ae 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -24,12 +24,12 @@ public class ExtSeqWithTimeWindowConsumer { props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); - Consumer consumer = new KafkaConsumer<>(props); + Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { buffer.add(record.value()); }); @@ -43,7 +43,7 @@ public class ExtSeqWithTimeWindowConsumer { private static void processBuffer(List buffer) { Collections.sort(buffer); buffer.forEach(message -> { - System.out.println("Processing message with Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + System.out.println("Processing message with Global Sequence number: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index a20c569159..99e05990cb 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -19,6 +19,7 @@ public class ExtSeqWithTimeWindowProducer { for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { long applicationIdentifier = Message.getRandomApplicationIdentifier(); Message message = new Message(partitionKey, applicationIdentifier); + message.setGlobalSequenceNumber(partitionKey); producer.send(new ProducerRecord<>("multi_partition_topic", partitionKey, message)); System.out.println("Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java index 734ecba53d..694d84f9d8 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java @@ -8,6 +8,8 @@ public class Message implements Comparable { private long partitionKey; private long applicationIdentifier; + private long globalSequenceNumber; + public Message(){ } @@ -26,9 +28,17 @@ public class Message implements Comparable { return applicationIdentifier; } + public long getGlobalSequenceNumber() { + return globalSequenceNumber; + } + + public void setGlobalSequenceNumber(long globalSequenceNumber) { + this.globalSequenceNumber = globalSequenceNumber; + } + @Override public int compareTo(Message other) { - return Long.compare(this.partitionKey, other.partitionKey); + return Long.compare(this.globalSequenceNumber, other.globalSequenceNumber); } @Override diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java new file mode 100644 index 0000000000..a01c230026 --- /dev/null +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -0,0 +1,138 @@ +package com.baeldung.kafka.message.ordering; + +import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; +import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; +import org.apache.kafka.clients.admin.*; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.KafkaFuture; +import org.apache.kafka.common.serialization.LongDeserializer; +import org.apache.kafka.common.serialization.LongSerializer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.KafkaContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import static org.junit.jupiter.api.Assertions.*; + +@Testcontainers +public class ExtSeqWithTimeWindowIntegrationTest { + private static String TOPIC = "multi_partition_topic"; + private static int PARTITIONS = 5; + private static short REPLICATION_FACTOR = 1; + private static Admin admin; + private static KafkaProducer producer; + private static KafkaConsumer consumer; + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + + private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + + @BeforeAll + static void setup() throws ExecutionException, InterruptedException { + KAFKA_CONTAINER.addExposedPort(9092); + + Properties adminProperties = new Properties(); + adminProperties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + + Properties producerProperties = new Properties(); + producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); + producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); + + Properties consumerProperties = new Properties(); + consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); + consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); + consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); + consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + admin = Admin.create(adminProperties); + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + List topicList = new ArrayList<>(); + NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + topicList.add(newTopic); + CreateTopicsResult result = admin.createTopics(topicList); + KafkaFuture future = result.values().get(TOPIC); + future.whenComplete((voidResult, exception) -> { + if (exception != null) { + System.err.println("Error creating the topic: " + exception.getMessage()); + } else { + System.out.println("Topic created successfully!"); + } + }).get(); + } + + @AfterAll + static void destroy() { + KAFKA_CONTAINER.stop(); + } + + @Test + void givenMultiplePartitions_whenPublishedToKafkaAndConsumedWithExtSeqNumberAndTimeWindow_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { + List sentMessageList = new ArrayList<>(); + List receivedMessageList = new ArrayList<>(); + for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { + long applicationIdentifier = Message.getRandomApplicationIdentifier(); + Message message = new Message(partitionKey, applicationIdentifier); + message.setGlobalSequenceNumber(partitionKey); + Future future = producer.send(new ProducerRecord<>(TOPIC, partitionKey, message)); + sentMessageList.add(message); + RecordMetadata metadata = future.get(); + System.out.println("Partition : " + metadata.partition()); + } + + boolean isOrderMaintained = true; + consumer.subscribe(Collections.singletonList(TOPIC)); + List buffer = new ArrayList<>(); + long lastProcessedTime = System.nanoTime(); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + buffer.add(record.value()); + }); + while (buffer.size() > 0) { + if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_NS) { + processBuffer(buffer, receivedMessageList); + lastProcessedTime = System.nanoTime(); + } + records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + records.forEach(record -> { + buffer.add(record.value()); + }); + } + for (int insertPosition = 0; insertPosition <= receivedMessageList.size() - 1; insertPosition++) { + if (isOrderMaintained){ + Message sentMessage = sentMessageList.get(insertPosition); + Message receivedMessage = receivedMessageList.get(insertPosition); + if (!sentMessage.equals(receivedMessage)) { + isOrderMaintained = false; + } + } + } + assertTrue(isOrderMaintained); + } + + private static void processBuffer(List buffer, List receivedMessageList) { + Collections.sort(buffer); + buffer.forEach(message -> { + receivedMessageList.add(message); + System.out.println("Processing message with Global Sequence number: " + message.getGlobalSequenceNumber() + ", Application Identifier: " + message.getApplicationIdentifier()); + }); + buffer.clear(); + } +} From c30b23a1408a16082ed404d6cf05e90ffe4f1af7 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 17 Oct 2023 06:30:29 +0300 Subject: [PATCH 142/831] JAVA-24463 Cleanup spring-reactive-modules (#14989) * JAVA-24463 Renaming spring-data-couchbase into spring-reactive-data-couchbase * JAVA-24463 Moving spring boot actuator from spring reactive security to spring reactive 3 * JAVA-24463 Migrating URL matching and set header on response from spring-5 reactive to spring reactive-2 * JAVA-24463 Migrating reactive websocket and session reactive support to spring-reactive-3 --------- Co-authored-by: timis1 --- spring-reactive-modules/pom.xml | 6 +- .../spring-5-reactive/.gitignore | 12 -- .../spring-5-reactive/README.md | 14 -- .../spring-5-reactive/pom.xml | 164 ------------------ .../src/main/assets/index.html | 10 -- .../configuration/WebFluxSecurityConfig.java | 56 ------ .../src/main/resources/application.properties | 2 - .../spring-reactive-2/README.md | 2 + .../spring-reactive-2/pom.xml | 4 + .../reactive/Spring5ReactiveApplication.java | 0 .../controller/FooReactiveController.java | 0 .../controller/PathPatternController.java | 0 .../java/com/baeldung/reactive/model/Foo.java | 0 .../controllers/ResponseHeaderController.java | 0 .../filter/AddResponseHeaderWebFilter.java | 0 .../handlers/ResponseHeaderHandler.java | 0 .../ResponseHeadersRouterFunctions.java | 0 .../com/baeldung/reactive/urlmatch/Actor.java | 0 ...Spring5URLPatternUsingRouterFunctions.java | 2 +- .../reactive/urlmatch/FormHandler.java | 0 .../urlmatch/FunctionalWebApplication.java | 0 .../reactive/urlmatch/IndexRewriteFilter.java | 0 .../com/baeldung/reactive/util/CpuUtils.java | 0 .../src/main/resources/files/hello.txt | 0 .../src/main/resources/files/test/test.txt | 0 .../main/resources/resources/test/test.txt | 0 .../com/baeldung/reactive/FluxUnitTest.java | 0 .../ResponseHeaderLiveTest.java | 0 ...rnUsingRouterFunctionsIntegrationTest.java | 0 ...ernsUsingHandlerMethodIntegrationTest.java | 0 .../spring-reactive-3/README.md | 3 + .../spring-reactive-3/pom.xml | 16 ++ .../src/main/WEB-INF/web.xml | 0 .../java/com/baeldung/functional/Actor.java | 0 .../com/baeldung/functional/FormHandler.java | 0 .../FunctionalSpringBootApplication.java | 0 .../functional/FunctionalWebApplication.java | 0 .../functional/IndexRewriteFilter.java | 0 .../com/baeldung/functional/RootServlet.java | 0 .../DownstreamServiceHealthIndicator.java | 0 .../reactive/actuator/FeaturesEndpoint.java | 0 .../actuator/InfoWebEndpointExtension.java | 0 .../actuator/Spring5ReactiveApplication.java | 2 + .../com/baeldung/websession/Application.java | 0 .../websession/configuration/RedisConfig.java | 0 .../configuration/SessionConfig.java | 0 .../configuration/WebFluxConfig.java | 1 - .../controller/SessionController.java | 0 .../websession/transfer/CustomResponse.java | 0 .../java/com/baeldung/websocket/Event.java | 0 .../ReactiveJavaClientWebSocket.java | 0 .../ReactiveWebSocketApplication.java | 0 .../ReactiveWebSocketConfiguration.java | 0 .../websocket/ReactiveWebSocketHandler.java | 0 .../websocket/WebSocketController.java | 0 .../src/main/resources/application.properties | 14 +- .../src/main/resources/files/hello.txt | 1 + .../src/main/resources/logback.xml | 0 .../resources/static/client-websocket.html | 0 .../java/com/baeldung/SpringContextTest.java | 4 +- ...nctionalWebApplicationIntegrationTest.java | 0 .../actuator/ActuatorInfoIntegrationTest.java | 6 +- .../src/test/resources/baeldung-weekly.png | Bin .../README.md | 0 .../pom.xml | 2 +- .../ReactiveCouchbaseApplication.java | 0 .../configuration/CouchbaseProperties.java | 0 .../N1QLReactiveCouchbaseConfiguration.java | 0 .../ReactiveCouchbaseConfiguration.java | 0 .../ViewReactiveCouchbaseConfiguration.java | 0 .../com/baeldung/couchbase/domain/Person.java | 0 .../repository/n1ql/N1QLPersonRepository.java | 0 .../n1ql/N1QLSortingPersonRepository.java | 0 .../repository/view/ViewPersonRepository.java | 0 .../src/main/resources/couchbase.properties | 0 .../src/main/resources/logback.xml | 0 .../CouchbaseMockConfiguration.java | 0 .../n1ql/N1QLPersonRepositoryLiveTest.java | 0 .../N1QLSortingPersonRepositoryLiveTest.java | 0 .../ViewPersonRepositoryIntegrationTest.java | 0 .../spring-reactive-security/README.md | 1 - .../spring-reactive-security/pom.xml | 4 - .../reactive/actuator/WebSecurityConfig.java | 23 --- .../java/com/baeldung/SpringContextTest.java | 5 +- 84 files changed, 51 insertions(+), 303 deletions(-) delete mode 100644 spring-reactive-modules/spring-5-reactive/.gitignore delete mode 100644 spring-reactive-modules/spring-5-reactive/README.md delete mode 100644 spring-reactive-modules/spring-5-reactive/pom.xml delete mode 100644 spring-reactive-modules/spring-5-reactive/src/main/assets/index.html delete mode 100644 spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java delete mode 100644 spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/controller/PathPatternController.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/model/Foo.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/responseheaders/controllers/ResponseHeaderController.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/responseheaders/filter/AddResponseHeaderWebFilter.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/responseheaders/functional/handlers/ResponseHeaderHandler.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/responseheaders/functional/routers/ResponseHeadersRouterFunctions.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/urlmatch/Actor.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java (98%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/java/com/baeldung/reactive/util/CpuUtils.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/resources/files/hello.txt (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/resources/files/test/test.txt (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/main/resources/resources/test/test.txt (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/test/java/com/baeldung/reactive/FluxUnitTest.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-2}/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/WEB-INF/web.xml (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/Actor.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/FormHandler.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/FunctionalWebApplication.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/IndexRewriteFilter.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/functional/RootServlet.java (100%) rename spring-reactive-modules/{spring-reactive-security => spring-reactive-3}/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceHealthIndicator.java (100%) rename spring-reactive-modules/{spring-reactive-security => spring-reactive-3}/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java (100%) rename spring-reactive-modules/{spring-reactive-security => spring-reactive-3}/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java (100%) rename spring-reactive-modules/{spring-reactive-security => spring-reactive-3}/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java (73%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/Application.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/configuration/RedisConfig.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/configuration/SessionConfig.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java (89%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/controller/SessionController.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websession/transfer/CustomResponse.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/Event.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/ReactiveJavaClientWebSocket.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/ReactiveWebSocketHandler.java (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/java/com/baeldung/websocket/WebSocketController.java (100%) create mode 100644 spring-reactive-modules/spring-reactive-3/src/main/resources/files/hello.txt rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/resources/logback.xml (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/main/resources/static/client-websocket.html (100%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/test/java/com/baeldung/SpringContextTest.java (75%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java (100%) rename spring-reactive-modules/{spring-reactive-security => spring-reactive-3}/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java (87%) rename spring-reactive-modules/{spring-5-reactive => spring-reactive-3}/src/test/resources/baeldung-weekly.png (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/README.md (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/pom.xml (98%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/domain/Person.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/resources/couchbase.properties (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/main/resources/logback.xml (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java (100%) rename spring-reactive-modules/{spring-data-couchbase => spring-reactive-data-couchbase}/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java (100%) delete mode 100644 spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/WebSecurityConfig.java diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 06519d723a..dd827d796e 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -19,7 +19,6 @@ spring-reactive-data spring-reactive-data-2 - spring-5-reactive spring-reactive-2 spring-reactive-3 spring-reactive-client @@ -27,7 +26,7 @@ spring-reactive-filters spring-reactive-oauth spring-reactive-security - spring-data-couchbase + spring-reactive-data-couchbase spring-reactive spring-reactive-exceptions spring-reactor @@ -64,7 +63,4 @@ - - - \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/.gitignore b/spring-reactive-modules/spring-5-reactive/.gitignore deleted file mode 100644 index dec013dfa4..0000000000 --- a/spring-reactive-modules/spring-5-reactive/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#folders# -.idea -/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-reactive-modules/spring-5-reactive/README.md b/spring-reactive-modules/spring-5-reactive/README.md deleted file mode 100644 index 3f44267234..0000000000 --- a/spring-reactive-modules/spring-5-reactive/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## Spring 5 Reactive Project - -This module contains articles about reactive Spring Boot - -### The Course -The "REST With Spring" Classes: https://bit.ly/restwithspring - -### Relevant Articles - -- [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) -- [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) -- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) -- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- More articles: [[next -->]](../spring-5-reactive-2) \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/pom.xml b/spring-reactive-modules/spring-5-reactive/pom.xml deleted file mode 100644 index fd47c70a07..0000000000 --- a/spring-reactive-modules/spring-5-reactive/pom.xml +++ /dev/null @@ -1,164 +0,0 @@ - - 4.0.0 - spring-5-reactive - 0.0.1-SNAPSHOT - spring-5-reactive - jar - spring 5 sample project about new features - - - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-integration - - - org.springframework.boot - spring-boot-starter-websocket - - - javax.json.bind - javax.json.bind-api - - - org.projectlombok - lombok - compile - - - org.apache.geronimo.specs - geronimo-json_1.1_spec - ${geronimo-json_1.1_spec.version} - - - org.apache.johnzon - johnzon-jsonb - - - - org.apache.commons - commons-lang3 - - - - org.springframework.boot - spring-boot-devtools - runtime - - - org.springframework - spring-test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.security - spring-security-test - test - - - io.projectreactor - reactor-test - test - - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.session - spring-session-core - - - org.springframework.session - spring-session-data-redis - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - test - - - io.reactivex.rxjava2 - rxjava - - - org.apache.httpcomponents - httpclient - - - io.netty - netty-all - - - - - - - maven-resources-plugin - 3.0.1 - - - copy-resources - validate - - copy-resources - - - - - src/main/assets - true - - - ${basedir}/target/classes/assets - - - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.reactive.Spring5ReactiveApplication - JAR - - - - - - - 1.1.3 - 1.0 - 1.0 - - - \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/src/main/assets/index.html b/spring-reactive-modules/spring-5-reactive/src/main/assets/index.html deleted file mode 100644 index 047514df1c..0000000000 --- a/spring-reactive-modules/spring-5-reactive/src/main/assets/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Baeldung: Static Content in Spring WebFlux - - -Example Spring Web Flux and web resources configuration - - \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java b/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java deleted file mode 100644 index 61927e47ab..0000000000 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.baeldung.websession.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.server.SecurityWebFilterChain; -import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository; - -@Configuration -@EnableWebFluxSecurity -public class WebFluxSecurityConfig { - - @Bean - public MapReactiveUserDetailsService userDetailsService() { - UserDetails admin = User - .withUsername("admin") - .password(encoder().encode("password")) - .roles("ADMIN") - .build(); - - UserDetails user = User - .withUsername("user") - .password(encoder().encode("password")) - .roles("USER") - .build(); - - return new MapReactiveUserDetailsService(admin, user); - } - - @Bean - public SecurityWebFilterChain webSessionSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange().authenticated() - .and() - .httpBasic() - .securityContextRepository(new WebSessionServerSecurityContextRepository()) - .and() - .formLogin(); - - http.csrf().disable(); - - return http.build(); - - } - - @Bean - public PasswordEncoder encoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties b/spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties deleted file mode 100644 index dfe4a4d994..0000000000 --- a/spring-reactive-modules/spring-5-reactive/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -logging.level.root=INFO -server.tomcat.max-keep-alive-requests=1 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-2/README.md b/spring-reactive-modules/spring-reactive-2/README.md index a5df5187bf..a6a4c4f5d0 100644 --- a/spring-reactive-modules/spring-reactive-2/README.md +++ b/spring-reactive-modules/spring-reactive-2/README.md @@ -7,4 +7,6 @@ This module contains articles about reactive Spring Boot. - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [Backpressure Mechanism in Spring WebFlux](https://www.baeldung.com/spring-webflux-backpressure) +- [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) - More articles: [[<-- prev]](../spring-5-reactive) [[next -->]](../spring-5-reactive-3) diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index ba40f3b48a..13970851cd 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -59,6 +59,10 @@ spring-security-test test + + org.springframework.boot + spring-boot-starter-tomcat + diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/PathPatternController.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/controller/PathPatternController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/PathPatternController.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/controller/PathPatternController.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/model/Foo.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/model/Foo.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/controllers/ResponseHeaderController.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/controllers/ResponseHeaderController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/controllers/ResponseHeaderController.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/controllers/ResponseHeaderController.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/filter/AddResponseHeaderWebFilter.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/filter/AddResponseHeaderWebFilter.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/filter/AddResponseHeaderWebFilter.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/filter/AddResponseHeaderWebFilter.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/functional/handlers/ResponseHeaderHandler.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/functional/handlers/ResponseHeaderHandler.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/functional/handlers/ResponseHeaderHandler.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/functional/handlers/ResponseHeaderHandler.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/functional/routers/ResponseHeadersRouterFunctions.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/functional/routers/ResponseHeadersRouterFunctions.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/responseheaders/functional/routers/ResponseHeadersRouterFunctions.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/responseheaders/functional/routers/ResponseHeadersRouterFunctions.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/Actor.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/Actor.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/Actor.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/Actor.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java similarity index 98% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java index b7bb53600e..6007597220 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java @@ -32,7 +32,7 @@ public class ExploreSpring5URLPatternUsingRouterFunctions { .and(RouterFunctions.resources("/resources/**", new ClassPathResource("resources/"))); } - WebServer start() throws Exception { + WebServer start() { WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) .filter(new IndexRewriteFilter()) diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/util/CpuUtils.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/reactive/util/CpuUtils.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/files/hello.txt b/spring-reactive-modules/spring-reactive-2/src/main/resources/files/hello.txt similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/resources/files/hello.txt rename to spring-reactive-modules/spring-reactive-2/src/main/resources/files/hello.txt diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/files/test/test.txt b/spring-reactive-modules/spring-reactive-2/src/main/resources/files/test/test.txt similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/resources/files/test/test.txt rename to spring-reactive-modules/spring-reactive-2/src/main/resources/files/test/test.txt diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/resources/test/test.txt b/spring-reactive-modules/spring-reactive-2/src/main/resources/resources/test/test.txt similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/resources/resources/test/test.txt rename to spring-reactive-modules/spring-reactive-2/src/main/resources/resources/test/test.txt diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/FluxUnitTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java rename to spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/FluxUnitTest.java diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java rename to spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java rename to spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java rename to spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java diff --git a/spring-reactive-modules/spring-reactive-3/README.md b/spring-reactive-modules/spring-reactive-3/README.md index 640a60d63d..631763fa59 100644 --- a/spring-reactive-modules/spring-reactive-3/README.md +++ b/spring-reactive-modules/spring-reactive-3/README.md @@ -5,4 +5,7 @@ This module contains articles about reactive Spring Boot. - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Reading Flux Into a Single InputStream Using Spring Reactive WebClient](https://www.baeldung.com/spring-reactive-read-flux-into-inputstream) - [Cancel an Ongoing Flux in Spring WebFlux](https://www.baeldung.com/spring-webflux-cancel-flux) +- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) +- [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) +- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) - More articles: [[<-- prev]](../spring-5-reactive-2) diff --git a/spring-reactive-modules/spring-reactive-3/pom.xml b/spring-reactive-modules/spring-reactive-3/pom.xml index 7672fa29f3..96f23f1339 100644 --- a/spring-reactive-modules/spring-reactive-3/pom.xml +++ b/spring-reactive-modules/spring-reactive-3/pom.xml @@ -47,6 +47,22 @@ org.projectlombok lombok + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.session + spring-session-core + + + org.springframework.session + spring-session-data-redis + diff --git a/spring-reactive-modules/spring-5-reactive/src/main/WEB-INF/web.xml b/spring-reactive-modules/spring-reactive-3/src/main/WEB-INF/web.xml similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/WEB-INF/web.xml rename to spring-reactive-modules/spring-reactive-3/src/main/WEB-INF/web.xml diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/Actor.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/Actor.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/Actor.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FormHandler.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FormHandler.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FormHandler.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FunctionalWebApplication.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalWebApplication.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/FunctionalWebApplication.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/IndexRewriteFilter.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/IndexRewriteFilter.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/IndexRewriteFilter.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/RootServlet.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/functional/RootServlet.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/functional/RootServlet.java diff --git a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceHealthIndicator.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceHealthIndicator.java similarity index 100% rename from spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceHealthIndicator.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceHealthIndicator.java diff --git a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java similarity index 100% rename from spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java diff --git a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java similarity index 100% rename from spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java diff --git a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java similarity index 73% rename from spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java index 600bff5948..19b83ee651 100644 --- a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java +++ b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java @@ -2,8 +2,10 @@ package com.baeldung.reactive.actuator; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.reactive.actuator") public class Spring5ReactiveApplication { public static void main(String[] args) { diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/Application.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/Application.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/RedisConfig.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/RedisConfig.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/SessionConfig.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/SessionConfig.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java similarity index 89% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java index 964b544916..041c37e7fc 100644 --- a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java +++ b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java @@ -4,7 +4,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.config.EnableWebFlux; -import org.springframework.web.reactive.config.ResourceHandlerRegistry; import org.springframework.web.reactive.config.WebFluxConfigurer; @Configuration diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/controller/SessionController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/controller/SessionController.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/transfer/CustomResponse.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websession/transfer/CustomResponse.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/Event.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/Event.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/Event.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/Event.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveJavaClientWebSocket.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveJavaClientWebSocket.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveJavaClientWebSocket.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveJavaClientWebSocket.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketApplication.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketConfiguration.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketHandler.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketHandler.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/ReactiveWebSocketHandler.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/ReactiveWebSocketHandler.java diff --git a/spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java b/spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/WebSocketController.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/java/com/baeldung/websocket/WebSocketController.java rename to spring-reactive-modules/spring-reactive-3/src/main/java/com/baeldung/websocket/WebSocketController.java diff --git a/spring-reactive-modules/spring-reactive-3/src/main/resources/application.properties b/spring-reactive-modules/spring-reactive-3/src/main/resources/application.properties index 815cc2b76d..767f8106dd 100644 --- a/spring-reactive-modules/spring-reactive-3/src/main/resources/application.properties +++ b/spring-reactive-modules/spring-reactive-3/src/main/resources/application.properties @@ -1 +1,13 @@ -# application properties \ No newline at end of file +# application properties +management.endpoints.web.exposure.include=* + +info.app.name=Spring Boot 2 actuator Application +management.endpoint.health.group.custom.include=diskSpace,ping +management.endpoint.health.group.custom.show-components=always +management.endpoint.health.group.custom.show-details=always +management.endpoint.health.group.custom.status.http-mapping.up=207 + +spring.main.allow-bean-definition-overriding=true + +logging.level.root=INFO +server.tomcat.max-keep-alive-requests=1 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-3/src/main/resources/files/hello.txt b/spring-reactive-modules/spring-reactive-3/src/main/resources/files/hello.txt new file mode 100644 index 0000000000..b6fc4c620b --- /dev/null +++ b/spring-reactive-modules/spring-reactive-3/src/main/resources/files/hello.txt @@ -0,0 +1 @@ +hello \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/logback.xml b/spring-reactive-modules/spring-reactive-3/src/main/resources/logback.xml similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/resources/logback.xml rename to spring-reactive-modules/spring-reactive-3/src/main/resources/logback.xml diff --git a/spring-reactive-modules/spring-5-reactive/src/main/resources/static/client-websocket.html b/spring-reactive-modules/spring-reactive-3/src/main/resources/static/client-websocket.html similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/main/resources/static/client-websocket.html rename to spring-reactive-modules/spring-reactive-3/src/main/resources/static/client-websocket.html diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java b/spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/SpringContextTest.java similarity index 75% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java rename to spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/SpringContextTest.java index bedb30fcaa..2dbd45349f 100644 --- a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/SpringContextTest.java @@ -5,10 +5,10 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.reactive.Spring5ReactiveApplication; +import com.baeldung.functional.FunctionalWebApplication; @RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5ReactiveApplication.class) +@SpringBootTest(classes = FunctionalWebApplication.class) public class SpringContextTest { @Test diff --git a/spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java b/spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java rename to spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java diff --git a/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java b/spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java similarity index 87% rename from spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java rename to spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java index 94979a18ca..79c694e6b9 100644 --- a/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-3/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java @@ -9,8 +9,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; -import java.io.IOException; - import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @@ -21,13 +19,13 @@ public class ActuatorInfoIntegrationTest { private TestRestTemplate restTemplate; @Test - public void whenGetInfo_thenReturns200() throws IOException { + public void whenGetInfo_thenReturns200() { final ResponseEntity responseEntity = this.restTemplate.getForEntity("/actuator/info", String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); } @Test - public void whenFeatures_thenReturns200() throws IOException { + public void whenFeatures_thenReturns200() { final ResponseEntity responseEntity = this.restTemplate.getForEntity("/actuator/features", String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); } diff --git a/spring-reactive-modules/spring-5-reactive/src/test/resources/baeldung-weekly.png b/spring-reactive-modules/spring-reactive-3/src/test/resources/baeldung-weekly.png similarity index 100% rename from spring-reactive-modules/spring-5-reactive/src/test/resources/baeldung-weekly.png rename to spring-reactive-modules/spring-reactive-3/src/test/resources/baeldung-weekly.png diff --git a/spring-reactive-modules/spring-data-couchbase/README.md b/spring-reactive-modules/spring-reactive-data-couchbase/README.md similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/README.md rename to spring-reactive-modules/spring-reactive-data-couchbase/README.md diff --git a/spring-reactive-modules/spring-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml similarity index 98% rename from spring-reactive-modules/spring-data-couchbase/pom.xml rename to spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index d7b36f97fa..52b10f39d9 100644 --- a/spring-reactive-modules/spring-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -3,7 +3,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 - spring-data-couchbase + spring-reactive-data-couchbase spring-data-couchbase jar diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/Person.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/Person.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/Person.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/Person.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/resources/couchbase.properties b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/resources/couchbase.properties similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/resources/couchbase.properties rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/resources/couchbase.properties diff --git a/spring-reactive-modules/spring-data-couchbase/src/main/resources/logback.xml b/spring-reactive-modules/spring-reactive-data-couchbase/src/main/resources/logback.xml similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/main/resources/logback.xml rename to spring-reactive-modules/spring-reactive-data-couchbase/src/main/resources/logback.xml diff --git a/spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java diff --git a/spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java b/spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java rename to spring-reactive-modules/spring-reactive-data-couchbase/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java diff --git a/spring-reactive-modules/spring-reactive-security/README.md b/spring-reactive-modules/spring-reactive-security/README.md index 37f999648c..a25fa3728b 100644 --- a/spring-reactive-modules/spring-reactive-security/README.md +++ b/spring-reactive-modules/spring-reactive-security/README.md @@ -7,6 +7,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) - [Guide to the AuthenticationManagerResolver in Spring Security](https://www.baeldung.com/spring-security-authenticationmanagerresolver) - [Spring Webflux and CORS](https://www.baeldung.com/spring-webflux-cors) diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index 8ed976c572..bd74202437 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -37,10 +37,6 @@ javax.json.bind javax.json.bind-api - - org.springframework.boot - spring-boot-starter-actuator - org.projectlombok lombok diff --git a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/WebSecurityConfig.java b/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/WebSecurityConfig.java deleted file mode 100644 index 384e26ac8c..0000000000 --- a/spring-reactive-modules/spring-reactive-security/src/main/java/com/baeldung/reactive/actuator/WebSecurityConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.reactive.actuator; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.web.server.SecurityWebFilterChain; - -@Configuration -@EnableWebFluxSecurity -public class WebSecurityConfig { - - @Bean - public SecurityWebFilterChain securitygWebFilterChain( - ServerHttpSecurity http) { - - return http.authorizeExchange() - .pathMatchers("/actuator/**").permitAll() - .anyExchange().authenticated() - .and().build(); - } - -} diff --git a/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/SpringContextTest.java b/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/SpringContextTest.java index e6123de118..a0a7d9264a 100644 --- a/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-reactive-modules/spring-reactive-security/src/test/java/com/baeldung/SpringContextTest.java @@ -1,13 +1,14 @@ package com.baeldung; -import com.baeldung.reactive.actuator.Spring5ReactiveApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.webflux.EmployeeWebSocketClient; + @RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5ReactiveApplication.class) +@SpringBootTest(classes = EmployeeWebSocketClient.class) public class SpringContextTest { @Test From 2efe2c7987e399c75e52c0eb528e47a81838ed4d Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 17 Oct 2023 13:50:31 +0700 Subject: [PATCH 143/831] using json body for sample --- .../CompletableFutureTimeoutUnitTest.java | 93 ++++++++++++++++++- 1 file changed, 90 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index c1de38ad37..62cf00930b 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -1,7 +1,9 @@ package com.baeldung.concurrent.completablefuture; +import com.fasterxml.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; +import net.minidev.json.writer.JsonReader; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -13,6 +15,7 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.*; +import java.util.function.Supplier; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -23,8 +26,93 @@ class CompletableFutureTimeoutUnitTest { private WireMockServer wireMockServer; private ScheduledExecutorService executorService; private static final int DEFAULT_TIMEOUT = 1000; //1 seconds - private static final String DEFAULT_PRODUCT = "default_product"; - private static final String PRODUCT_OFFERS = "product_offers"; + private static final String DEFAULT_PRODUCT = "{\n" + + " \"products\": [\n" + + " {\n" + + " \"id\": 2,\n" + + " \"title\": \"iPhone X\",\n" + + " \"description\": \"SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...\",\n" + + " \"price\": 899,\n" + + " \"discountPercentage\": 0.0,\n" + + " \"rating\": 4.44,\n" + + " \"stock\": 34,\n" + + " \"brand\": \"Apple\",\n" + + " \"category\": \"smartphones\"\n" + + " },\n" + + " {\n" + + " \"id\": 3,\n" + + " \"title\": \"Samsung Universe 9\",\n" + + " \"description\": \"Samsung's new variant which goes beyond Galaxy to the Universe\",\n" + + " \"price\": 1249,\n" + + " \"discountPercentage\": 0.0,\n" + + " \"rating\": 4.09,\n" + + " \"stock\": 36,\n" + + " \"brand\": \"Samsung\",\n" + + " \"category\": \"smartphones\"\n" + + " }\n" + + " ],\n" + + " \"total\": 2\n" + + "}"; + private static final String PRODUCT_OFFERS = "{\n" + + " \"products\": [\n" + + " {\n" + + " \"id\": 1,\n" + + " \"title\": \"iPhone 9\",\n" + + " \"description\": \"An apple mobile which is nothing like apple\",\n" + + " \"price\": 549,\n" + + " \"discountPercentage\": 12.96,\n" + + " \"rating\": 4.69,\n" + + " \"stock\": 94,\n" + + " \"brand\": \"Apple\",\n" + + " \"category\": \"smartphones\"\n" + + " },\n" + + " {\n" + + " \"id\": 2,\n" + + " \"title\": \"iPhone X\",\n" + + " \"description\": \"SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...\",\n" + + " \"price\": 899,\n" + + " \"discountPercentage\": 17.94,\n" + + " \"rating\": 4.44,\n" + + " \"stock\": 34,\n" + + " \"brand\": \"Apple\",\n" + + " \"category\": \"smartphones\"\n" + + " },\n" + + " {\n" + + " \"id\": 3,\n" + + " \"title\": \"Samsung Universe 9\",\n" + + " \"description\": \"Samsung's new variant which goes beyond Galaxy to the Universe\",\n" + + " \"price\": 1249,\n" + + " \"discountPercentage\": 15.46,\n" + + " \"rating\": 4.09,\n" + + " \"stock\": 36,\n" + + " \"brand\": \"Samsung\",\n" + + " \"category\": \"smartphones\"\n" + + " },\n" + + " {\n" + + " \"id\": 4,\n" + + " \"title\": \"OPPOF19\",\n" + + " \"description\": \"OPPO F19 is officially announced on April 2021.\",\n" + + " \"price\": 280,\n" + + " \"discountPercentage\": 17.91,\n" + + " \"rating\": 4.3,\n" + + " \"stock\": 123,\n" + + " \"brand\": \"OPPO\",\n" + + " \"category\": \"smartphones\"\n" + + " },\n" + + " {\n" + + " \"id\": 5,\n" + + " \"title\": \"Huawei P30\",\n" + + " \"description\": \"Huawei’s re-badged P30 Pro New Edition was officially unveiled yesterday in Germany and now the device has made its way to the UK.\",\n" + + " \"price\": 499,\n" + + " \"discountPercentage\": 10.58,\n" + + " \"rating\": 4.09,\n" + + " \"stock\": 32,\n" + + " \"brand\": \"Huawei\",\n" + + " \"category\": \"smartphones\"\n" + + " }\n" + + " ],\n" + + " \"total\": 5\n" + + "}"; @BeforeAll void setUp() { @@ -40,7 +128,6 @@ class CompletableFutureTimeoutUnitTest { executorService = Executors.newScheduledThreadPool(1); } - @AfterAll void tearDown() { executorService.shutdown(); From 38d4d8f621f8fc91f72979d0ad5790b1e585a654 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 17 Oct 2023 18:24:02 +0700 Subject: [PATCH 144/831] text block --- .../CompletableFutureTimeoutUnitTest.java | 181 +++++++++--------- 1 file changed, 90 insertions(+), 91 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 62cf00930b..bb538f2584 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -1,9 +1,7 @@ package com.baeldung.concurrent.completablefuture; -import com.fasterxml.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; -import net.minidev.json.writer.JsonReader; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -15,7 +13,6 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.*; -import java.util.function.Supplier; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,100 +23,102 @@ class CompletableFutureTimeoutUnitTest { private WireMockServer wireMockServer; private ScheduledExecutorService executorService; private static final int DEFAULT_TIMEOUT = 1000; //1 seconds - private static final String DEFAULT_PRODUCT = "{\n" + - " \"products\": [\n" + - " {\n" + - " \"id\": 2,\n" + - " \"title\": \"iPhone X\",\n" + - " \"description\": \"SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...\",\n" + - " \"price\": 899,\n" + - " \"discountPercentage\": 0.0,\n" + - " \"rating\": 4.44,\n" + - " \"stock\": 34,\n" + - " \"brand\": \"Apple\",\n" + - " \"category\": \"smartphones\"\n" + - " },\n" + - " {\n" + - " \"id\": 3,\n" + - " \"title\": \"Samsung Universe 9\",\n" + - " \"description\": \"Samsung's new variant which goes beyond Galaxy to the Universe\",\n" + - " \"price\": 1249,\n" + - " \"discountPercentage\": 0.0,\n" + - " \"rating\": 4.09,\n" + - " \"stock\": 36,\n" + - " \"brand\": \"Samsung\",\n" + - " \"category\": \"smartphones\"\n" + - " }\n" + - " ],\n" + - " \"total\": 2\n" + - "}"; - private static final String PRODUCT_OFFERS = "{\n" + - " \"products\": [\n" + - " {\n" + - " \"id\": 1,\n" + - " \"title\": \"iPhone 9\",\n" + - " \"description\": \"An apple mobile which is nothing like apple\",\n" + - " \"price\": 549,\n" + - " \"discountPercentage\": 12.96,\n" + - " \"rating\": 4.69,\n" + - " \"stock\": 94,\n" + - " \"brand\": \"Apple\",\n" + - " \"category\": \"smartphones\"\n" + - " },\n" + - " {\n" + - " \"id\": 2,\n" + - " \"title\": \"iPhone X\",\n" + - " \"description\": \"SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...\",\n" + - " \"price\": 899,\n" + - " \"discountPercentage\": 17.94,\n" + - " \"rating\": 4.44,\n" + - " \"stock\": 34,\n" + - " \"brand\": \"Apple\",\n" + - " \"category\": \"smartphones\"\n" + - " },\n" + - " {\n" + - " \"id\": 3,\n" + - " \"title\": \"Samsung Universe 9\",\n" + - " \"description\": \"Samsung's new variant which goes beyond Galaxy to the Universe\",\n" + - " \"price\": 1249,\n" + - " \"discountPercentage\": 15.46,\n" + - " \"rating\": 4.09,\n" + - " \"stock\": 36,\n" + - " \"brand\": \"Samsung\",\n" + - " \"category\": \"smartphones\"\n" + - " },\n" + - " {\n" + - " \"id\": 4,\n" + - " \"title\": \"OPPOF19\",\n" + - " \"description\": \"OPPO F19 is officially announced on April 2021.\",\n" + - " \"price\": 280,\n" + - " \"discountPercentage\": 17.91,\n" + - " \"rating\": 4.3,\n" + - " \"stock\": 123,\n" + - " \"brand\": \"OPPO\",\n" + - " \"category\": \"smartphones\"\n" + - " },\n" + - " {\n" + - " \"id\": 5,\n" + - " \"title\": \"Huawei P30\",\n" + - " \"description\": \"Huawei’s re-badged P30 Pro New Edition was officially unveiled yesterday in Germany and now the device has made its way to the UK.\",\n" + - " \"price\": 499,\n" + - " \"discountPercentage\": 10.58,\n" + - " \"rating\": 4.09,\n" + - " \"stock\": 32,\n" + - " \"brand\": \"Huawei\",\n" + - " \"category\": \"smartphones\"\n" + - " }\n" + - " ],\n" + - " \"total\": 5\n" + - "}"; + private static final String DEFAULT_PRODUCT = """ + { + "products": [ + { + "id": 2, + "title": "iPhone X", + "description": "SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...", + "price": 899, + "discountPercentage": 0.0, + "rating": 4.44, + "stock": 34, + "brand": "Apple", + "category": "smartphones" + }, + { + "id": 3, + "title": "Samsung Universe 9", + "description": "Samsung's new variant which goes beyond Galaxy to the Universe", + "price": 1249, + "discountPercentage": 0.0, + "rating": 4.09, + "stock": 36, + "brand": "Samsung", + "category": "smartphones" + } + ], + "total": 2 + }"""; + private static final String PRODUCT_OFFERS = """ + { + "products": [ + { + "id": 1, + "title": "iPhone 9", + "description": "An apple mobile which is nothing like apple", + "price": 549, + "discountPercentage": 12.96, + "rating": 4.69, + "stock": 94, + "brand": "Apple", + "category": "smartphones" + }, + { + "id": 2, + "title": "iPhone X", + "description": "SIM-Free, Model A19211 6.5-inch Super Retina HD display with OLED technology A12 Bionic chip with ...", + "price": 899, + "discountPercentage": 17.94, + "rating": 4.44, + "stock": 34, + "brand": "Apple", + "category": "smartphones" + }, + { + "id": 3, + "title": "Samsung Universe 9", + "description": "Samsung's new variant which goes beyond Galaxy to the Universe", + "price": 1249, + "discountPercentage": 15.46, + "rating": 4.09, + "stock": 36, + "brand": "Samsung", + "category": "smartphones" + }, + { + "id": 4, + "title": "OPPOF19", + "description": "OPPO F19 is officially announced on April 2021.", + "price": 280, + "discountPercentage": 17.91, + "rating": 4.3, + "stock": 123, + "brand": "OPPO", + "category": "smartphones" + }, + { + "id": 5, + "title": "Huawei P30", + "description": "Huawei’s re-badged P30 Pro New Edition was officially unveiled yesterday in Germany and now the device has made its way to the UK.", + "price": 499, + "discountPercentage": 10.58, + "rating": 4.09, + "stock": 32, + "brand": "Huawei", + "category": "smartphones" + } + ], + "total": 5 + }"""; @BeforeAll void setUp() { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); - + System.out.println(PRODUCT_OFFERS); stubFor(get(urlEqualTo("/api/dummy")) .willReturn(aResponse() .withFixedDelay(5000) // must be > DEFAULT_TIMEOUT for a timeout to occur. From 3f40e66508517cb871ca166f39795fb80ee1aa9b Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 17 Oct 2023 18:29:26 +0700 Subject: [PATCH 145/831] clean unused --- .../completablefuture/CompletableFutureTimeoutUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index bb538f2584..1932c03486 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -118,7 +118,7 @@ class CompletableFutureTimeoutUnitTest { wireMockServer = new WireMockServer(8080); wireMockServer.start(); WireMock.configureFor("localhost", 8080); - System.out.println(PRODUCT_OFFERS); + stubFor(get(urlEqualTo("/api/dummy")) .willReturn(aResponse() .withFixedDelay(5000) // must be > DEFAULT_TIMEOUT for a timeout to occur. From 223c0bd32f661914004053038213bcfc423629fc Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 17 Oct 2023 18:45:08 +0700 Subject: [PATCH 146/831] [Update] rename completableFuture to productDataFuture --- .../CompletableFutureTimeoutUnitTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 1932c03486..116093b6c3 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -160,23 +160,23 @@ class CompletableFutureTimeoutUnitTest { @Test void whenorTimeout_thenGetThrow() { - CompletableFuture completableFuture = fetchProductData(); - completableFuture.orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); - assertThrows(ExecutionException.class, completableFuture::get); + CompletableFuture productDataFuture = fetchProductData(); + productDataFuture.orTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + assertThrows(ExecutionException.class, productDataFuture::get); } @Test void whencompleteOnTimeout_thenReturnValue() throws ExecutionException, InterruptedException { - CompletableFuture completableFuture = fetchProductData(); - completableFuture.completeOnTimeout(DEFAULT_PRODUCT, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); - assertEquals(DEFAULT_PRODUCT, completableFuture.get()); + CompletableFuture productDataFuture = fetchProductData(); + productDataFuture.completeOnTimeout(DEFAULT_PRODUCT, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + assertEquals(DEFAULT_PRODUCT, productDataFuture.get()); } @Test void whencompleteExceptionally_thenGetThrow() { - CompletableFuture completableFuture = fetchProductData(); - executorService.schedule(() -> completableFuture + CompletableFuture productDataFuture = fetchProductData(); + executorService.schedule(() -> productDataFuture .completeExceptionally(new TimeoutException("Timeout occurred")), DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); - assertThrows(ExecutionException.class, completableFuture::get); + assertThrows(ExecutionException.class, productDataFuture::get); } } From 7eef9b46b7be751e72c79e0c528fe8cfda49e5a1 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 17 Oct 2023 20:18:28 +0700 Subject: [PATCH 147/831] [Optimize] using try-with-resources --- .../completablefuture/CompletableFutureTimeoutUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java index 116093b6c3..d04865026b 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTimeoutUnitTest.java @@ -138,15 +138,14 @@ class CompletableFutureTimeoutUnitTest { try { URL url = new URL("http://localhost:8080/api/dummy"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - try { - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } - in.close(); return response.toString(); } finally { @@ -158,6 +157,7 @@ class CompletableFutureTimeoutUnitTest { }); } + @Test void whenorTimeout_thenGetThrow() { CompletableFuture productDataFuture = fetchProductData(); From 573132d239a837bc967950eff46a772ee68dd927 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 17 Oct 2023 19:13:25 +0300 Subject: [PATCH 148/831] [JAVA-26119] Merged aws-s3-update-object module with aws-s3 --- aws-modules/aws-s3-update-object/pom.xml | 43 -------- .../AwsS3UpdateObjectApplication.java | 13 --- .../controller/FileController.java | 24 ----- .../service/FileService.java | 80 --------------- .../src/main/resources/application.properties | 1 - .../controller/FileControllerUnitTest.java | 62 ------------ .../service/FileServiceUnitTest.java | 99 ------------------- aws-modules/aws-s3/README.md | 1 + .../java/com/baeldung/s3/S3Application.java | 7 ++ .../main/java/com/baeldung/s3/S3Service.java | 10 +- .../baeldung/s3/S3ServiceIntegrationTest.java | 16 +++ aws-modules/pom.xml | 1 - 12 files changed, 33 insertions(+), 324 deletions(-) delete mode 100644 aws-modules/aws-s3-update-object/pom.xml delete mode 100644 aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/AwsS3UpdateObjectApplication.java delete mode 100644 aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/controller/FileController.java delete mode 100644 aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/service/FileService.java delete mode 100644 aws-modules/aws-s3-update-object/src/main/resources/application.properties delete mode 100644 aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/controller/FileControllerUnitTest.java delete mode 100644 aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/service/FileServiceUnitTest.java diff --git a/aws-modules/aws-s3-update-object/pom.xml b/aws-modules/aws-s3-update-object/pom.xml deleted file mode 100644 index 3cf7b657b0..0000000000 --- a/aws-modules/aws-s3-update-object/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - 4.0.0 - aws-s3-update-object - 0.0.1-SNAPSHOT - aws-s3-update-object - Project demonstrating overwriting of S3 objects - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - - - com.amazonaws - aws-java-sdk - ${aws-java-sdk-version} - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - 1.12.523 - - diff --git a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/AwsS3UpdateObjectApplication.java b/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/AwsS3UpdateObjectApplication.java deleted file mode 100644 index 24866c287b..0000000000 --- a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/AwsS3UpdateObjectApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.awss3updateobject; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AwsS3UpdateObjectApplication { - - public static void main(String[] args) { - SpringApplication.run(AwsS3UpdateObjectApplication.class, args); - } - -} diff --git a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/controller/FileController.java b/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/controller/FileController.java deleted file mode 100644 index e87358ef56..0000000000 --- a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/controller/FileController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.awss3updateobject.controller; - -import com.baeldung.awss3updateobject.service.FileService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -@RestController -@RequestMapping("api/v1/file") -public class FileController { - - @Autowired - FileService fileService; - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile multipartFile) throws Exception { - return this.fileService.uploadFile(multipartFile); - } - - @PostMapping("/update") - public String updateFile(@RequestParam("file") MultipartFile multipartFile, @RequestParam("filePath") String exitingFilePath) throws Exception { - return this.fileService.updateFile(multipartFile, exitingFilePath); - } -} diff --git a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/service/FileService.java b/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/service/FileService.java deleted file mode 100644 index 23eaad7913..0000000000 --- a/aws-modules/aws-s3-update-object/src/main/java/com/baeldung/awss3updateobject/service/FileService.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.awss3updateobject.service; - -import com.amazonaws.auth.AWSCredentials; -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.regions.Regions; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.services.s3.model.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.PostConstruct; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - -@Service -public class FileService { - - private static final Logger logger = LoggerFactory.getLogger(FileService.class); - - public AmazonS3 amazonS3; - - @Value("${aws.s3bucket}") - public String awsS3Bucket; - - @PostConstruct - private void init(){ - AWSCredentials credentials = new BasicAWSCredentials( - "AWS AccessKey", - "AWS secretKey" - ); - this.amazonS3 = AmazonS3ClientBuilder.standard() - .withRegion(Regions.fromName("us-east-1")) - .withCredentials(new AWSStaticCredentialsProvider(credentials)) - .build(); - } - - public String uploadFile(MultipartFile multipartFile) throws Exception { - String key = "/documents/" + multipartFile.getOriginalFilename(); - return this.uploadDocument(this.awsS3Bucket, key, multipartFile); - } - - public String updateFile(MultipartFile multipartFile, String key) throws Exception { - return this.uploadDocument(this.awsS3Bucket, key, multipartFile); - } - - private String uploadDocument(String s3bucket, String key, MultipartFile multipartFile) throws Exception { - try { - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentType(multipartFile.getContentType()); - Map attributes = new HashMap<>(); - attributes.put("document-content-size", String.valueOf(multipartFile.getSize())); - metadata.setUserMetadata(attributes); - InputStream documentStream = multipartFile.getInputStream(); - PutObjectResult putObjectResult = this.amazonS3.putObject(new PutObjectRequest(s3bucket, key, documentStream, metadata)); - - S3Object s3Object = this.amazonS3.getObject(s3bucket, key); - logger.info("Last Modified: " + s3Object.getObjectMetadata().getLastModified()); - return key; - } catch (AmazonS3Exception ex) { - if (ex.getErrorCode().equalsIgnoreCase("NoSuchBucket")) { - String msg = String.format("No bucket found with name %s", s3bucket); - throw new Exception(msg); - } else if (ex.getErrorCode().equalsIgnoreCase("AccessDenied")) { - String msg = String.format("Access denied to S3 bucket %s", s3bucket); - throw new Exception(msg); - } - throw ex; - } catch (IOException ex) { - String msg = String.format("Error saving file %s to AWS S3 bucket %s", key, s3bucket); - throw new Exception(msg); - } - } -} diff --git a/aws-modules/aws-s3-update-object/src/main/resources/application.properties b/aws-modules/aws-s3-update-object/src/main/resources/application.properties deleted file mode 100644 index c840d970a8..0000000000 --- a/aws-modules/aws-s3-update-object/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -aws.s3bucket=baeldung-documents; diff --git a/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/controller/FileControllerUnitTest.java b/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/controller/FileControllerUnitTest.java deleted file mode 100644 index 823391c139..0000000000 --- a/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/controller/FileControllerUnitTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.awss3updateobject.controller; - -import com.baeldung.awss3updateobject.service.FileService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.multipart.MultipartFile; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; - -public class FileControllerUnitTest { - - private MockMvc mockMvc; - - @Mock - private FileService fileService; - - @InjectMocks - private FileController fileController; - - @BeforeEach - public void setUp() { - MockitoAnnotations.openMocks(this); - this.mockMvc = MockMvcBuilders.standaloneSetup(fileController).build(); - } - - @Test - public void givenValidMultipartFile_whenUploadedViaEndpoint_thenCorrectPathIsReturned() throws Exception { - MockMultipartFile multipartFile = new MockMultipartFile("file", "test.txt", "text/plain", "sample file content".getBytes()); - String expectedResult = "File Uploaded Successfully"; - - when(fileService.uploadFile(multipartFile)).thenReturn(expectedResult); - - mockMvc.perform(multipart("/api/v1/file/upload").file(multipartFile)) - .andExpect(status().isOk()) - .andExpect(content().string(expectedResult)); - } - - @Test - public void givenValidMultipartFileAndExistingPath_whenUpdatedViaEndpoint_thenSamePathIsReturned() throws Exception { - MockMultipartFile multipartFile = new MockMultipartFile("file", "test.txt", "text/plain", "updated file content".getBytes()); - String filePath = "some/path/to/file"; - String expectedResult = "File Updated Successfully"; - - when(fileService.updateFile(multipartFile, filePath)).thenReturn(expectedResult); - - mockMvc.perform(multipart("/api/v1/file/update") - .file(multipartFile) - .param("filePath", filePath)) - .andExpect(status().isOk()) - .andExpect(content().string(expectedResult)); - } -} \ No newline at end of file diff --git a/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/service/FileServiceUnitTest.java b/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/service/FileServiceUnitTest.java deleted file mode 100644 index 90ed77b148..0000000000 --- a/aws-modules/aws-s3-update-object/src/test/java/com/baeldung/awss3updateobject/service/FileServiceUnitTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.baeldung.awss3updateobject.service; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.AmazonS3Exception; -import com.amazonaws.services.s3.model.PutObjectRequest; -import com.amazonaws.services.s3.model.S3Object; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -public class FileServiceUnitTest { - - @Mock - private AmazonS3 amazonS3; - - @Mock - private MultipartFile multipartFile; - - @InjectMocks - private FileService fileService; - - @BeforeEach - public void setup() { - MockitoAnnotations.openMocks(this); - fileService = new FileService(); - fileService.awsS3Bucket = "test-bucket"; - fileService.amazonS3 = amazonS3; - } - - @Test - public void givenValidFile_whenUploaded_thenKeyMatchesDocumentPath() throws Exception { - when(multipartFile.getName()).thenReturn("testFile"); - when(multipartFile.getOriginalFilename()).thenReturn("testFile"); - when(multipartFile.getContentType()).thenReturn("application/pdf"); - when(multipartFile.getSize()).thenReturn(1024L); - when(multipartFile.getInputStream()).thenReturn(mock(InputStream.class)); - - S3Object s3Object = new S3Object(); - when(amazonS3.putObject(any())).thenReturn(null); - when(amazonS3.getObject(anyString(), anyString())).thenReturn(s3Object); - - String key = fileService.uploadFile(multipartFile); - - assertEquals("/documents/testFile", key); - } - - @Test - public void givenValidFile_whenUploadFailsDueToNoBucket_thenExceptionIsThrown() throws Exception { - when(multipartFile.getName()).thenReturn("testFile"); - when(multipartFile.getOriginalFilename()).thenReturn("testFile"); - when(multipartFile.getContentType()).thenReturn("application/pdf"); - when(multipartFile.getSize()).thenReturn(1024L); - when(multipartFile.getInputStream()).thenReturn(mock(InputStream.class)); - - AmazonS3Exception exception = new AmazonS3Exception("Test exception"); - exception.setErrorCode("NoSuchBucket"); - when(amazonS3.putObject(any(PutObjectRequest.class))).thenThrow(exception); - - assertThrows(Exception.class, () -> fileService.uploadFile(multipartFile)); - } - - @Test - public void givenExistingFile_whenUpdated_thenSameKeyIsReturned() throws Exception { - when(multipartFile.getName()).thenReturn("testFile"); - when(multipartFile.getContentType()).thenReturn("application/pdf"); - when(multipartFile.getSize()).thenReturn(1024L); - when(multipartFile.getInputStream()).thenReturn(mock(InputStream.class)); - - S3Object s3Object = new S3Object(); - when(amazonS3.putObject(any(PutObjectRequest.class))).thenReturn(null); - when(amazonS3.getObject(anyString(), anyString())).thenReturn(s3Object); - - String key = "/documents/existingFile"; - String resultKey = fileService.updateFile(multipartFile, key); - - assertEquals(key, resultKey); - } - - @Test - public void givenFileWithIOException_whenUpdated_thenExceptionIsThrown() throws Exception { - when(multipartFile.getName()).thenReturn("testFile"); - when(multipartFile.getContentType()).thenReturn("application/pdf"); - when(multipartFile.getSize()).thenReturn(1024L); - when(multipartFile.getInputStream()).thenThrow(new IOException("Test IO Exception")); - - assertThrows(Exception.class, () -> fileService.updateFile(multipartFile, "/documents/existingFile")); - } -} \ No newline at end of file diff --git a/aws-modules/aws-s3/README.md b/aws-modules/aws-s3/README.md index 9b862c8685..f3b34b584e 100644 --- a/aws-modules/aws-s3/README.md +++ b/aws-modules/aws-s3/README.md @@ -11,3 +11,4 @@ This module contains articles about Simple Storage Service (S3) on AWS - [Listing All AWS S3 Objects in a Bucket Using Java](https://www.baeldung.com/java-aws-s3-list-bucket-objects) - [Update an Existing Amazon S3 Object Using Java](https://www.baeldung.com/java-update-amazon-s3-object) - [How To Rename Files and Folders in Amazon S3](https://www.baeldung.com/java-amazon-s3-rename-files-folders) +- [Update an Existing Amazon S3 Object Using Java](https://www.baeldung.com/java-update-amazon-s3-object) diff --git a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java index abf570f0d0..3328006bc0 100644 --- a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java +++ b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Application.java @@ -45,6 +45,13 @@ public class S3Application { new File("/Users/user/Document/hello.txt") ); + s3Service.updateObject( + AWS_BUCKET, + "Document/hello2.txt", + new File("/Users/user/Document/hello2.txt") + ); + + //listing objects s3Service.listObjects(AWS_BUCKET); diff --git a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Service.java b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Service.java index f4f768d1b4..dfc8e9de5f 100644 --- a/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Service.java +++ b/aws-modules/aws-s3/src/main/java/com/baeldung/s3/S3Service.java @@ -24,6 +24,7 @@ import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.HeadObjectRequest; +import software.amazon.awssdk.services.s3.model.HeadObjectResponse; import software.amazon.awssdk.services.s3.model.ListBucketsResponse; import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; @@ -99,7 +100,13 @@ class S3Service { .key(key) .build(); - return s3Client.putObject(request, Path.of(file.toURI()) ); + + return s3Client.putObject(request, Path.of(file.toURI())); + } + + //updating object + public PutObjectResponse updateObject(String bucketName, String key, java.io.File file) { + return this.putObject(bucketName, key, file); } //listing objects @@ -110,6 +117,7 @@ class S3Service { ListObjectsV2Response listObjectsV2Response = s3Client.listObjectsV2(listObjectsV2Request); for(S3Object os : listObjectsV2Response.contents()) { + System.out.println(os.key()); } } diff --git a/aws-modules/aws-s3/src/test/java/com/baeldung/s3/S3ServiceIntegrationTest.java b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/S3ServiceIntegrationTest.java index bf24bcaa43..15db15831c 100644 --- a/aws-modules/aws-s3/src/test/java/com/baeldung/s3/S3ServiceIntegrationTest.java +++ b/aws-modules/aws-s3/src/test/java/com/baeldung/s3/S3ServiceIntegrationTest.java @@ -11,6 +11,8 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.io.File; +import java.nio.file.Path; import java.util.Collections; import software.amazon.awssdk.services.s3.S3Client; @@ -23,6 +25,7 @@ import software.amazon.awssdk.services.s3.model.HeadBucketRequest; import software.amazon.awssdk.services.s3.model.ListBucketsResponse; import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; class S3ServiceIntegrationTest { @@ -38,6 +41,8 @@ class S3ServiceIntegrationTest { private final String AWS_BUCKET = "baeldung-tutorial-s3"; + private File file = new File("/Users/user/Document/hello2.txt"); + @BeforeEach public void setup() { MockitoAnnotations.openMocks(this); @@ -75,6 +80,17 @@ class S3ServiceIntegrationTest { verify(s3Client).createBucket(bucketRequest); } + @Test + void whenVerifyingUploadOfS3Object_thenCorrect() { + PutObjectRequest request = PutObjectRequest.builder() + .bucket(BUCKET_NAME) + .key(KEY_NAME) + .build(); + + s3Service.putObject(BUCKET_NAME, KEY_NAME, file); + verify(s3Client).putObject(request, Path.of(file.toURI()) ); + } + @Test void whenVerifyingListBuckets_thenCorrect() { when(s3Client.listBuckets()).thenReturn(ListBucketsResponse.builder().buckets(Collections.emptyList()).build()); diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 66fa4bffa1..06cea2f260 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -28,7 +28,6 @@ aws-miscellaneous aws-reactive aws-s3 - aws-s3-update-object From 88a19c651eed770b69eb751570be46bd6ce60cf7 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Mon, 2 Oct 2023 01:54:54 +0200 Subject: [PATCH 149/831] BAEL-6952: reuse testcontainers --- .../reuse/ReusableContainersLiveTest.java | 52 +++++++++++++++++++ .../DynamicPropertiesLiveTest.java | 2 +- .../{ => support}/LocalDevApplication.java | 1 + .../ServiceConnectionLiveTest.java | 2 +- 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/reuse/ReusableContainersLiveTest.java rename spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/{ => support}/DynamicPropertiesLiveTest.java (98%) rename spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/{ => support}/LocalDevApplication.java (95%) rename spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/{ => support}/ServiceConnectionLiveTest.java (97%) diff --git a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/reuse/ReusableContainersLiveTest.java b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/reuse/ReusableContainersLiveTest.java new file mode 100644 index 0000000000..4a96160e32 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/reuse/ReusableContainersLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.testcontainers.reuse; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.utility.DockerImageName; + +import com.baeldung.testcontainers.support.MiddleEarthCharacter; +import com.baeldung.testcontainers.support.MiddleEarthCharactersRepository; + +@SpringBootTest +class ReusableContainersLiveTest { + + static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10")) + .withReuse(true); + + @BeforeAll + static void beforeAll() { + mongoDBContainer.start(); + } + + @DynamicPropertySource + static void setProperties(DynamicPropertyRegistry registry) { + registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl); + } + + @Autowired + private MiddleEarthCharactersRepository repository; + + @Test + void whenRunningMultipleTimes_thenContainerShouldBeReused_andTestShouldFail() { + assertThat(repository.findAll()) + .isEmpty(); + + repository.saveAll(List.of( + new MiddleEarthCharacter("Frodo", "hobbit"), + new MiddleEarthCharacter("Samwise", "hobbit")) + ); + + assertThat(repository.findAll()) + .hasSize(2); + } + +} diff --git a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/DynamicPropertiesLiveTest.java b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/DynamicPropertiesLiveTest.java similarity index 98% rename from spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/DynamicPropertiesLiveTest.java rename to spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/DynamicPropertiesLiveTest.java index 2633f227d4..d2511286e3 100644 --- a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/DynamicPropertiesLiveTest.java +++ b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/DynamicPropertiesLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testcontainers; +package com.baeldung.testcontainers.support; import static io.restassured.RestAssured.when; import static org.hamcrest.Matchers.hasItems; diff --git a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/LocalDevApplication.java b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/LocalDevApplication.java similarity index 95% rename from spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/LocalDevApplication.java rename to spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/LocalDevApplication.java index 1b6fe32c97..0b49fba26b 100644 --- a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/LocalDevApplication.java +++ b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/LocalDevApplication.java @@ -7,6 +7,7 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect import org.springframework.context.annotation.Bean; import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.utility.DockerImageName; +import com.baeldung.testcontainers.Application; // Testcontainers require a valid docker installation. diff --git a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/ServiceConnectionLiveTest.java b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/ServiceConnectionLiveTest.java similarity index 97% rename from spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/ServiceConnectionLiveTest.java rename to spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/ServiceConnectionLiveTest.java index 51b69c44b3..a93c136e1c 100644 --- a/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/ServiceConnectionLiveTest.java +++ b/spring-boot-modules/spring-boot-3-testcontainers/src/test/java/com/baeldung/testcontainers/support/ServiceConnectionLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testcontainers; +package com.baeldung.testcontainers.support; import static io.restassured.RestAssured.when; import static org.hamcrest.Matchers.hasItems; From 5b936c47a0c9a4cbf1ad4f8b695d47d7b76ca5be Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Tue, 17 Oct 2023 19:39:27 -0400 Subject: [PATCH 150/831] Message to User Event Rename --- .../ExtSeqWithTimeWindowConsumer.java | 17 +++--- .../ExtSeqWithTimeWindowProducer.java | 17 +++--- .../ordering/MultiPartitionConsumer.java | 15 +++-- .../ordering/MultiPartitionProducer.java | 15 ++--- .../ordering/SinglePartitionConsumer.java | 13 ++-- .../ordering/SinglePartitionProducer.java | 16 ++--- .../message/ordering/payload/Message.java | 61 ------------------- .../message/ordering/payload/UserEvent.java | 58 ++++++++++++++++++ .../ExtSeqWithTimeWindowIntegrationTest.java | 46 +++++++------- .../MultiplePartitionIntegrationTest.java | 36 +++++------ .../SinglePartitionIntegrationTest.java | 34 +++++------ 11 files changed, 163 insertions(+), 165 deletions(-) delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java create mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index cd424178ae..639a980462 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -1,13 +1,12 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.LongDeserializer; -import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.*; @@ -23,13 +22,13 @@ public class ExtSeqWithTimeWindowConsumer { props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); - Consumer consumer = new KafkaConsumer<>(props); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); + Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); - List buffer = new ArrayList<>(); + List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { buffer.add(record.value()); }); @@ -40,10 +39,10 @@ public class ExtSeqWithTimeWindowConsumer { } } - private static void processBuffer(List buffer) { + private static void processBuffer(List buffer) { Collections.sort(buffer); - buffer.forEach(message -> { - System.out.println("Processing message with Global Sequence number: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + buffer.forEach(userEvent -> { + System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", event nano time : " + userEvent.getEventNanoTime()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index 99e05990cb..c18e35b351 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -1,6 +1,6 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; @@ -8,6 +8,7 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; +import java.util.UUID; public class ExtSeqWithTimeWindowProducer { public static void main(String[] args) { @@ -15,13 +16,13 @@ public class ExtSeqWithTimeWindowProducer { props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - message.setGlobalSequenceNumber(partitionKey); - producer.send(new ProducerRecord<>("multi_partition_topic", partitionKey, message)); - System.out.println("Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long sequenceNumber = 1; sequenceNumber <= 10 ; sequenceNumber++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + userEvent.setGlobalSequenceNumber(sequenceNumber); + producer.send(new ProducerRecord<>("multi_partition_topic", sequenceNumber, userEvent)); + System.out.println("User Event Nano time : " + userEvent.getEventNanoTime() + ", User Event Id: " + userEvent.getUserEventId()); } producer.close(); System.out.println("ExternalSequencingProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java index c37c645d31..e738832425 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -1,13 +1,12 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.LongDeserializer; -import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.Collections; @@ -22,15 +21,15 @@ public class MultiPartitionConsumer { props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); - Consumer consumer = new KafkaConsumer<>(props); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); + Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("multi_partition_topic")); while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { - Message message = record.value(); - if (message != null) { - System.out.println("Process message with Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + UserEvent userEvent = record.value(); + if (userEvent != null) { + System.out.println("Process message with event nano time : " + userEvent.getEventNanoTime() + ", Event ID: " + userEvent.getUserEventId()); } }); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index 81cc5c6af0..db02c87bbe 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -1,6 +1,6 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; @@ -8,6 +8,7 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; +import java.util.UUID; public class MultiPartitionProducer { public static void main(String[] args) { @@ -15,12 +16,12 @@ public class MultiPartitionProducer { props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - producer.send(new ProducerRecord<>("multi_partition_topic", partitionKey, message)); - System.out.println("Partition Key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long count = 1; count <= 10 ; count++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + producer.send(new ProducerRecord<>("multi_partition_topic", count, userEvent)); + System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java index 9f44cd78c6..5f5ce86924 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -1,13 +1,12 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.LongDeserializer; -import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.Collections; @@ -23,14 +22,14 @@ public class SinglePartitionConsumer { props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); - Consumer consumer = new KafkaConsumer<>(props); + props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); + Consumer consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("single_partition_topic")); while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { - Message message = record.value(); - System.out.println("Process message with Partition Key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + UserEvent userEvent = record.value(); + System.out.println("Process message with event nano time : " + userEvent.getEventNanoTime() + ", Event ID: " + userEvent.getUserEventId()); }); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index efa6e5b93d..2a7719e34f 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -1,13 +1,15 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.LongSerializer; +import java.time.Instant; import java.util.Properties; +import java.util.UUID; public class SinglePartitionProducer { public static void main(String[] args) { @@ -15,12 +17,12 @@ public class SinglePartitionProducer { props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - producer.send(new ProducerRecord<>("single_partition_topic", partitionKey, message)); - System.out.println("Partition key: " + message.getPartitionKey() + ", Application Identifier: " + message.getApplicationIdentifier()); + KafkaProducer producer = new KafkaProducer<>(props); + for (long count = 1; count <= 10 ; count++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + producer.send(new ProducerRecord<>("single_partition_topic", count, userEvent)); + System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java deleted file mode 100644 index 694d84f9d8..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/Message.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.baeldung.kafka.message.ordering.payload; - -import java.util.Objects; -import java.util.Random; -import java.util.concurrent.ThreadLocalRandom; - -public class Message implements Comparable { - private long partitionKey; - private long applicationIdentifier; - - private long globalSequenceNumber; - - public Message(){ - - } - - //Required for Kafka Serialization and Deserialization - public Message(long partitionKey, long applicationIdentifier) { - this.partitionKey = partitionKey; - this.applicationIdentifier = applicationIdentifier; - } - - public long getPartitionKey() { - return partitionKey; - } - - public long getApplicationIdentifier() { - return applicationIdentifier; - } - - public long getGlobalSequenceNumber() { - return globalSequenceNumber; - } - - public void setGlobalSequenceNumber(long globalSequenceNumber) { - this.globalSequenceNumber = globalSequenceNumber; - } - - @Override - public int compareTo(Message other) { - return Long.compare(this.globalSequenceNumber, other.globalSequenceNumber); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof Message)) { - return false; - } - Message message = (Message) obj; - return this.applicationIdentifier == message.getApplicationIdentifier() && Objects.equals(this.partitionKey, message.getPartitionKey()); - } - - public static long getRandomApplicationIdentifier() { - Random rand = new Random(); - return ThreadLocalRandom.current().nextInt(1000); - } -} - diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java new file mode 100644 index 0000000000..0c4018e624 --- /dev/null +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java @@ -0,0 +1,58 @@ +package com.baeldung.kafka.message.ordering.payload; + +import java.util.Objects; +public class UserEvent implements Comparable { + private String userEventId; + + private long eventNanoTime; + + private long globalSequenceNumber; + + public UserEvent(){ + + } + + //Required for Kafka Serialization and Deserialization + public UserEvent(String userEventId) { + this.userEventId = userEventId; + } + + public String getUserEventId() { + return userEventId; + } + + public long getEventNanoTime() { + return eventNanoTime; + } + + public void setEventNanoTime(long eventNanoTime) { + this.eventNanoTime = eventNanoTime; + } + + public long getGlobalSequenceNumber() { + return globalSequenceNumber; + } + + public void setGlobalSequenceNumber(long globalSequenceNumber) { + this.globalSequenceNumber = globalSequenceNumber; + } + + @Override + public int compareTo(UserEvent other) { + return Long.compare(this.globalSequenceNumber, other.globalSequenceNumber); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof UserEvent)) { + return false; + } + UserEvent userEvent = (UserEvent) obj; + return Objects.equals(this.userEventId, userEvent.getUserEventId()) + && userEvent.getEventNanoTime() == this.eventNanoTime; + } +} + diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index a01c230026..5f540d5b50 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.admin.*; @@ -34,8 +34,8 @@ public class ExtSeqWithTimeWindowIntegrationTest { private static int PARTITIONS = 5; private static short REPLICATION_FACTOR = 1; private static Admin admin; - private static KafkaProducer producer; - private static KafkaConsumer consumer; + private static KafkaProducer producer; + private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds @@ -59,7 +59,7 @@ public class ExtSeqWithTimeWindowIntegrationTest { consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); @@ -85,29 +85,29 @@ public class ExtSeqWithTimeWindowIntegrationTest { @Test void givenMultiplePartitions_whenPublishedToKafkaAndConsumedWithExtSeqNumberAndTimeWindow_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { - List sentMessageList = new ArrayList<>(); - List receivedMessageList = new ArrayList<>(); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - message.setGlobalSequenceNumber(partitionKey); - Future future = producer.send(new ProducerRecord<>(TOPIC, partitionKey, message)); - sentMessageList.add(message); + List sentUserEventList = new ArrayList<>(); + List receivedUserEventList = new ArrayList<>(); + for (long sequenceNumber = 1; sequenceNumber <= 10 ; sequenceNumber++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + userEvent.setGlobalSequenceNumber(sequenceNumber); + Future future = producer.send(new ProducerRecord<>(TOPIC, sequenceNumber, userEvent)); + sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); System.out.println("Partition : " + metadata.partition()); } boolean isOrderMaintained = true; consumer.subscribe(Collections.singletonList(TOPIC)); - List buffer = new ArrayList<>(); + List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { buffer.add(record.value()); }); while (buffer.size() > 0) { if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_NS) { - processBuffer(buffer, receivedMessageList); + processBuffer(buffer, receivedUserEventList); lastProcessedTime = System.nanoTime(); } records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); @@ -115,11 +115,11 @@ public class ExtSeqWithTimeWindowIntegrationTest { buffer.add(record.value()); }); } - for (int insertPosition = 0; insertPosition <= receivedMessageList.size() - 1; insertPosition++) { + for (int insertPosition = 0; insertPosition <= receivedUserEventList.size() - 1; insertPosition++) { if (isOrderMaintained){ - Message sentMessage = sentMessageList.get(insertPosition); - Message receivedMessage = receivedMessageList.get(insertPosition); - if (!sentMessage.equals(receivedMessage)) { + UserEvent sentUserEvent = sentUserEventList.get(insertPosition); + UserEvent receivedUserEvent = receivedUserEventList.get(insertPosition); + if (!sentUserEvent.equals(receivedUserEvent)) { isOrderMaintained = false; } } @@ -127,11 +127,11 @@ public class ExtSeqWithTimeWindowIntegrationTest { assertTrue(isOrderMaintained); } - private static void processBuffer(List buffer, List receivedMessageList) { + private static void processBuffer(List buffer, List receivedUserEventList) { Collections.sort(buffer); - buffer.forEach(message -> { - receivedMessageList.add(message); - System.out.println("Processing message with Global Sequence number: " + message.getGlobalSequenceNumber() + ", Application Identifier: " + message.getApplicationIdentifier()); + buffer.forEach(userEvent -> { + receivedUserEventList.add(userEvent); + System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index c948effd70..d4b88ad06f 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.admin.*; @@ -34,8 +34,8 @@ public class MultiplePartitionIntegrationTest { private static int PARTITIONS = 5; private static short REPLICATION_FACTOR = 1; private static Admin admin; - private static KafkaProducer producer; - private static KafkaConsumer consumer; + private static KafkaProducer producer; + private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -57,7 +57,7 @@ public class MultiplePartitionIntegrationTest { consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); @@ -83,29 +83,29 @@ public class MultiplePartitionIntegrationTest { @Test void givenMultiplePartitions_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { - List sentMessageList = new ArrayList<>(); - List receivedMessageList = new ArrayList<>(); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - Future future = producer.send(new ProducerRecord<>(TOPIC, partitionKey, message)); - sentMessageList.add(message); + List sentUserEventList = new ArrayList<>(); + List receivedUserEventList = new ArrayList<>(); + for (long count = 1; count <= 10 ; count++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + Future future = producer.send(new ProducerRecord<>(TOPIC, count, userEvent)); + sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); System.out.println("Partition : " + metadata.partition()); } boolean isOrderMaintained = true; consumer.subscribe(Collections.singletonList(TOPIC)); - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { - Message message = record.value(); - receivedMessageList.add(message); + UserEvent userEvent = record.value(); + receivedUserEventList.add(userEvent); }); - for (int insertPosition = 0; insertPosition <= receivedMessageList.size() - 1; insertPosition++) { + for (int insertPosition = 0; insertPosition <= receivedUserEventList.size() - 1; insertPosition++) { if (isOrderMaintained){ - Message sentMessage = sentMessageList.get(insertPosition); - Message receivedMessage = receivedMessageList.get(insertPosition); - if (!sentMessage.equals(receivedMessage)) { + UserEvent sentUserEvent = sentUserEventList.get(insertPosition); + UserEvent receivedUserEvent = receivedUserEventList.get(insertPosition); + if (!sentUserEvent.equals(receivedUserEvent)) { isOrderMaintained = false; } } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 87b7d07431..b41dc67686 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.message.ordering.payload.Message; +import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.admin.Admin; @@ -36,8 +36,8 @@ public class SinglePartitionIntegrationTest { private static int PARTITIONS = 1; private static short REPLICATION_FACTOR = 1; private static Admin admin; - private static KafkaProducer producer; - private static KafkaConsumer consumer; + private static KafkaProducer producer; + private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); @@ -61,7 +61,7 @@ public class SinglePartitionIntegrationTest { consumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, Message.class); + consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); @@ -87,29 +87,29 @@ public class SinglePartitionIntegrationTest { @Test void givenASinglePartition_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { - List sentMessageList = new ArrayList<>(); - List receivedMessageList = new ArrayList<>(); - for (long partitionKey = 1; partitionKey <= 10 ; partitionKey++) { - long applicationIdentifier = Message.getRandomApplicationIdentifier(); - Message message = new Message(partitionKey, applicationIdentifier); - ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, partitionKey, message); + List sentUserEventList = new ArrayList<>(); + List receivedUserEventList = new ArrayList<>(); + for (long count = 1; count <= 10 ; count++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setEventNanoTime(System.nanoTime()); + ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, userEvent); Future future = producer.send(producerRecord); - sentMessageList.add(message); + sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); System.out.println("Partition : " + metadata.partition()); } consumer.subscribe(Collections.singletonList(TOPIC)); - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); + ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { - Message message = record.value(); - receivedMessageList.add(message); + UserEvent userEvent = record.value(); + receivedUserEventList.add(userEvent); }); boolean result = true; for (int count = 0; count <= 9 ; count++) { - Message sentMessage = sentMessageList.get(count); - Message receivedMessage = receivedMessageList.get(count); - if (!sentMessage.equals(receivedMessage) && result){ + UserEvent sentUserEvent = sentUserEventList.get(count); + UserEvent receivedUserEvent = receivedUserEventList.get(count); + if (!sentUserEvent.equals(receivedUserEvent) && result){ result = false; } } From 3298d5fb960849c9ea17f0473169a92fe2136ae6 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Wed, 18 Oct 2023 04:59:54 +0300 Subject: [PATCH 151/831] Updating code related to the article BAEL-7017 (#15009) * Update pom.xml Update pom with the apache dependency * Update WriteHashmaptoCVSFileUnitTest.java Adding a new test method to solve the problem using Apache Commons CSV. --- .../core-java-collections-maps-7/pom.xml | 7 +++- .../WriteHashmaptoCVSFileUnitTest.java | 36 ++++++++++--------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index bb7c6e9fb5..bcc0915073 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -73,6 +73,11 @@ 4.13.1 test + + org.apache.commons + commons-csv + 1.5 + - \ No newline at end of file + diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java index ddebaf2468..e23a5da8ff 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/writehashmaptocsvfile/WriteHashmaptoCVSFileUnitTest.java @@ -10,18 +10,26 @@ import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVPrinter; + import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class WriteHashmaptoCVSFileUnitTest { + public Map employeeData; - @Test - public void givenEmployeeData_whenWriteToCSV_thenCSVFileIsCreated() { - Map employeeData = new HashMap<>(); + public WriteHashmaptoCVSFileUnitTest() { + employeeData = new HashMap<>(); employeeData.put("Name", "John Doe"); employeeData.put("Title", "Software Engineer"); employeeData.put("Department", "Engineering"); employeeData.put("Salary", "75000"); + } + + @Test + public void givenEmployeeData_whenWriteToCSVUsingFileWriter_thenCSVFileIsCreated() { + try (FileWriter csvWriter = new FileWriter("employee_data.csv")) { // Write header row csvWriter.append("Name,Title,Department,Salary\n"); @@ -40,23 +48,19 @@ public class WriteHashmaptoCVSFileUnitTest { } @Test - public void givenCSVFile_whenRead_thenContentsMatchExpected() { - // Read the actual content of the CSV file - StringBuilder actualCsvContent = new StringBuilder(); - try { - Files.lines(Paths.get("employee_data.csv")) - .forEach(line -> actualCsvContent.append(line).append("\n")); + public void givenCSVFile_whenWriteToCSVUsingApacheCommons_thenContentsMatchExpected() { - // Define the expected CSV content - String expectedCsvContent = "Name,Title,Department,Salary\n" + - "John Doe,Software Engineer,Engineering,75000\n"; + try (CSVPrinter csvPrinter = new CSVPrinter(new FileWriter("employee_data2.csv"), CSVFormat.DEFAULT)) { + // Write header row + csvPrinter.printRecord("Name", "Title", "Department", "Salary"); - // Compare the actual content with the expected content - assertEquals(expectedCsvContent, actualCsvContent.toString()); - - System.out.println("CSV file created successfully."); + // Write data row + csvPrinter.printRecord(employeeData.get("Name"), employeeData.get("Title"), employeeData.get("Department"), employeeData.get("Salary")); } catch (IOException e) { e.printStackTrace(); } + + // Ensure the CSV file exists + assertTrue(new File("employee_data2.csv").exists()); } } From faddb1d62cfdaefe1f948cf09c514144f2d099d9 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Wed, 18 Oct 2023 05:03:31 +0300 Subject: [PATCH 152/831] Update CenteringTextUnitTest.java (#15011) This commit aims to add new updates to the class "CenteringTextUnitTest" based on the review process recommendations. --- .../centertext/CenteringTextUnitTest.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java index ff53d8b3fa..a3f95b0181 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.centertext; import liquibase.repackaged.org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.jupiter.api.Test; + import static org.junit.Assert.assertEquals; public class CenteringTextUnitTest { @@ -10,17 +11,16 @@ public class CenteringTextUnitTest { @Test public void givenTextAndTotalWidth_whenUsingStringFormat_thenTextIsCentered() { String text = "Centered Text"; - int totalWidth = 20; + int totalWidth = 15; int padding = (totalWidth - text.length()) / 2; String centeredText = String.format("%" + padding + "s%s%" + padding + "s", "", text, ""); - String expectedCenteredText = " Centered Text "; - Assert.assertEquals("Centered Text", expectedCenteredText, centeredText); + Assert.assertEquals(" Centered Text ", centeredText); } @Test public void givenTextAndTotalWidth_whenCenterUsingStringBuilder_thenTextIsCentered() { String text = "Centered Text"; - int width = 20; + int width = 15; int padding = (width - text.length()) / 2; StringBuilder centeredText = new StringBuilder(); for (int i = 0; i < padding; i++) { @@ -31,17 +31,15 @@ public class CenteringTextUnitTest { centeredText.append(" "); } String centeredTextString = centeredText.toString(); - String expectedCenteredText = " Centered Text "; - Assert.assertEquals("Centered Text", expectedCenteredText, centeredTextString); + Assert.assertEquals(" Centered Text ", centeredTextString); } @Test public void givenTextAndTotalWidth_whenUsingStringUtilsCenterMethod_thenTextIsCentered() { String text = "Centered Text"; - int width = 20; + int width = 15; String centeredText = StringUtils.center(text, width); - String expectedCenteredText = StringUtils.center("Centered Text", width); - assertEquals("Centered Text", expectedCenteredText, centeredText); + assertEquals(" Centered Text ", centeredText); } -} \ No newline at end of file +} From c3c8b1d016be332c534dc6704f04cbfbf0592daa Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 18 Oct 2023 12:29:41 +0530 Subject: [PATCH 153/831] Update README.md (#15016) --- core-java-modules/core-java-streams-simple/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams-simple/README.md b/core-java-modules/core-java-streams-simple/README.md index 94d74f4c49..4cbe32ce32 100644 --- a/core-java-modules/core-java-streams-simple/README.md +++ b/core-java-modules/core-java-streams-simple/README.md @@ -2,6 +2,10 @@ This module contains articles about Streams that are part of the Java Streams Ebook. +### 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. + ### Relevant Articles - [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction) @@ -11,4 +15,4 @@ This module contains articles about Streams that are part of the Java Streams Eb - [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap) - [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream) - [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector) -- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce) \ No newline at end of file +- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce) From 140974c9bf75947a6f9d7404e4f313cd576a0d25 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 18 Oct 2023 15:26:35 +0530 Subject: [PATCH 154/831] Java 25299 Fixes made for spring-data-jpa-repo-3 test failures in integration-jdk9-and-above (#14906) --- .../spring/data/jpa/listrepositories/entity/Library.java | 2 +- .../src/main/resources/application.properties | 2 +- .../BookPagingAndSortingRepositoryIntegrationTest.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java index 04c0ad5e0a..724adc3aad 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/java/com/baeldung/spring/data/jpa/listrepositories/entity/Library.java @@ -19,7 +19,7 @@ public class Library { private List addresses = new ArrayList<>(); @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) - @CollectionTable(name = "book", joinColumns = @JoinColumn(name = "library_id")) + @CollectionTable(name = "books", joinColumns = @JoinColumn(name = "library_id")) @Column(name = "book", nullable = false) private List books = new ArrayList<>(); diff --git a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties index cd6dbe3994..37f37d548d 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa-repo-3/src/main/resources/application.properties @@ -1,5 +1,5 @@ spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=none - +spring.jpa.generate-ddl=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE diff --git a/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/BookPagingAndSortingRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/BookPagingAndSortingRepositoryIntegrationTest.java index 8f34e43e3f..9ea865c04f 100644 --- a/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/BookPagingAndSortingRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo-3/src/test/java/com/baeldung/spring/data/jpa/listrepositories/repository/BookPagingAndSortingRepositoryIntegrationTest.java @@ -21,13 +21,13 @@ public class BookPagingAndSortingRepositoryIntegrationTest { @Test public void givenDbContainsBooks_whenfindBooksByAuthor_thenReturnBooksByAuthor() { - Book book1 = new Book("Spring Data", "John Doe", "1234567890"); - Book book2 = new Book("Spring Data 2", "John Doe", "1234567891"); - Book book3 = new Book("Spring Data 3", "John Doe", "1234567892"); + Book book1 = new Book("Spring Data", "John Miller", "1234567890"); + Book book2 = new Book("Spring Data 2", "John Miller", "1234567891"); + Book book3 = new Book("Spring Data 3", "John Miller", "1234567892"); bookPagingAndSortingRepository.saveAll(Arrays.asList(book1, book2, book3)); Pageable pageable = PageRequest.of(0, 2, Sort.by("title").descending()); - List books = bookPagingAndSortingRepository.findBooksByAuthor("John Doe", pageable); + List books = bookPagingAndSortingRepository.findBooksByAuthor("John Miller", pageable); Assertions.assertEquals(2, books.size()); Assertions.assertEquals(book3.getId(), books.get(0).getId()); Assertions.assertEquals(book2.getId(), books.get(1).getId()); From 0f93942502d5041f5fef49b525728b675fc0478c Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 18 Oct 2023 14:11:54 +0300 Subject: [PATCH 155/831] Update README.md --- core-java-modules/core-java-lang-math-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-math-3/README.md b/core-java-modules/core-java-lang-math-3/README.md index ef9c2ee4c4..37027970b6 100644 --- a/core-java-modules/core-java-lang-math-3/README.md +++ b/core-java-modules/core-java-lang-math-3/README.md @@ -12,4 +12,5 @@ - [Java Program to Print Pascal’s Triangle](https://www.baeldung.com/java-pascal-triangle) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [Clamp Function in Java](https://www.baeldung.com/java-clamp-function) +- [Creating a Magic Square in Java](https://www.baeldung.com/java-magic-square) - More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2) From 43e4c6d9fe2e229d3485b9e1bd905a783eeb2ed4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 18 Oct 2023 14:12:40 +0300 Subject: [PATCH 156/831] Delete core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/README.md --- .../src/test/java/com/baeldung/magicsquare/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/README.md diff --git a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/README.md b/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/README.md deleted file mode 100644 index b2f7ece88a..0000000000 --- a/core-java-modules/core-java-lang-math-3/src/test/java/com/baeldung/magicsquare/README.md +++ /dev/null @@ -1,2 +0,0 @@ -## Relevant Articles -- [Creating a Magic Square in Java](https://www.baeldung.com/java-magic-square) From 73e58da770c085ce838a3e6a2f2f6fe3b6b0ec6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Peterli=C4=87?= Date: Wed, 18 Oct 2023 14:51:58 +0200 Subject: [PATCH 157/831] BAEL-7002 - Drawbacks of Singleton Pattern (#14979) * BAEL-7002 - Drawbacks of Singleton Pattern * Add mockito-inline dependency --- .../design-patterns-creational-2/pom.xml | 9 +++++ .../java/com/baeldung/singleton/Logger.java | 38 +++++++++++++++++++ .../com/baeldung/singleton/SingletonDemo.java | 12 ++++++ .../baeldung/singleton/SingletonUnitTest.java | 35 +++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java create mode 100644 patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java create mode 100644 patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java diff --git a/patterns-modules/design-patterns-creational-2/pom.xml b/patterns-modules/design-patterns-creational-2/pom.xml index fe79052a99..27c83c9eb7 100644 --- a/patterns-modules/design-patterns-creational-2/pom.xml +++ b/patterns-modules/design-patterns-creational-2/pom.xml @@ -12,4 +12,13 @@ 1.0.0-SNAPSHOT + + + org.mockito + mockito-inline + ${mockito.version} + test + + + \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java new file mode 100644 index 0000000000..31729c29f4 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/Logger.java @@ -0,0 +1,38 @@ +package com.baeldung.singleton; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDateTime; + +public class Logger { + private static volatile Logger instance; + + private PrintWriter fileWriter; + + public static Logger getInstance() { + if (instance == null) { + synchronized (Logger.class) { + if (instance == null) { + instance = new Logger(); + } + } + } + return instance; + } + + private Logger() { + try { + fileWriter = new PrintWriter(new FileWriter("app.log")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void log(String message) { + String log = String.format("[%s]- %s", LocalDateTime.now(), message); + fileWriter.println(log); + fileWriter.flush(); + } + +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java new file mode 100644 index 0000000000..2ebd6c8ad4 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/main/java/com/baeldung/singleton/SingletonDemo.java @@ -0,0 +1,12 @@ +package com.baeldung.singleton; + +public class SingletonDemo { + + public int sum(int a, int b) { + int result = a + b; + Logger logger = Logger.getInstance(); + logger.log("The sum is " + result); + return result; + } + +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java new file mode 100644 index 0000000000..d4154d9396 --- /dev/null +++ b/patterns-modules/design-patterns-creational-2/src/test/java/com/baeldung/singleton/SingletonUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.singleton; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; + +class SingletonUnitTest { + + @Test + void givenTwoValues_whenSum_thenReturnCorrectResult() { + SingletonDemo singletonDemo = new SingletonDemo(); + int result = singletonDemo.sum(12, 4); + Assertions.assertEquals(16, result); + } + + @Test + void givenMockedLogger_whenSum_thenReturnCorrectResult() { + Logger logger = mock(Logger.class); + + try (MockedStatic loggerMockedStatic = mockStatic(Logger.class)) { + loggerMockedStatic.when(Logger::getInstance).thenReturn(logger); + doNothing().when(logger).log(any()); + + SingletonDemo singletonDemo = new SingletonDemo(); + int result = singletonDemo.sum(12, 4); + Assertions.assertEquals(16, result); + } + } + +} From ab2834ddeb0393e8845aceca3f025284ca8def1b Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:23:55 +0300 Subject: [PATCH 158/831] Removed duplicated spring-cloud-contract from integration profile (#15025) --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2bd9aaa0d5..c227fe09e7 100644 --- a/pom.xml +++ b/pom.xml @@ -1218,7 +1218,6 @@ gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j spring-actuator - spring-cloud-modules/spring-cloud-contract spring-kafka-2 From 9e2e523da72c0aea5db170ca42296d93d39225c0 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 19 Oct 2023 12:42:14 +0300 Subject: [PATCH 159/831] JAVA-25805 Remove logback-test.xml --- .../src/test/resources/logback-test.xml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml diff --git a/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml b/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml deleted file mode 100644 index 56af2d397e..0000000000 --- a/spring-security-modules/spring-security-ldap/src/test/resources/logback-test.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - \ No newline at end of file From a44a7e4af11603b56c889b74757b019e71500da1 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 19 Oct 2023 15:24:46 +0530 Subject: [PATCH 160/831] JAVA-26001_A_C: Fix formatting of POMs for modules A to C (#14961) --- apache-poi-3/pom.xml | 4 ++-- core-java-modules/core-java-21/pom.xml | 16 ++++++++-------- .../pom.xml | 4 ++-- .../core-java-collections-array-list-2/pom.xml | 8 ++++---- .../core-java-collections-list-6/pom.xml | 5 +++-- core-java-modules/core-java-security-4/pom.xml | 4 ++-- 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/apache-poi-3/pom.xml b/apache-poi-3/pom.xml index 905db3d58c..e6e85d1212 100644 --- a/apache-poi-3/pom.xml +++ b/apache-poi-3/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 apache-poi-3 0.0.1-SNAPSHOT diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml index 7b8fa9063f..bfe1cd2c78 100644 --- a/core-java-modules/core-java-21/pom.xml +++ b/core-java-modules/core-java-21/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 core-java-21 core-java-21 @@ -12,12 +12,6 @@ 0.0.1-SNAPSHOT - - 21 - 21 - UTF-8 - - @@ -44,4 +38,10 @@ + + 21 + 21 + UTF-8 + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced-2/pom.xml b/core-java-modules/core-java-arrays-operations-advanced-2/pom.xml index 53cccb8a73..a0ae2398a4 100644 --- a/core-java-modules/core-java-arrays-operations-advanced-2/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced-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 core-java-arrays-operations-advanced-2 core-java-arrays-operations-advanced-2 diff --git a/core-java-modules/core-java-collections-array-list-2/pom.xml b/core-java-modules/core-java-collections-array-list-2/pom.xml index 042f6e5bb5..901a4f5c75 100644 --- a/core-java-modules/core-java-collections-array-list-2/pom.xml +++ b/core-java-modules/core-java-collections-array-list-2/pom.xml @@ -1,17 +1,17 @@ - 4.0.0 core-java-collections-array-list-2 core-java-collections-array-list-2 jar + com.baeldung.core-java-modules core-java-modules 0.0.1-SNAPSHOT - + @@ -24,7 +24,7 @@ - + 17 17 diff --git a/core-java-modules/core-java-collections-list-6/pom.xml b/core-java-modules/core-java-collections-list-6/pom.xml index 9bea6358c4..46ef4ff4c9 100644 --- a/core-java-modules/core-java-collections-list-6/pom.xml +++ b/core-java-modules/core-java-collections-list-6/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 core-java-collections-list-6 core-java-collections-list-6 @@ -12,4 +12,5 @@ core-java-modules 0.0.1-SNAPSHOT + \ No newline at end of file diff --git a/core-java-modules/core-java-security-4/pom.xml b/core-java-modules/core-java-security-4/pom.xml index aae33f87d4..2b9809b749 100644 --- a/core-java-modules/core-java-security-4/pom.xml +++ b/core-java-modules/core-java-security-4/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 core-java-security-4 core-java-security-4 From 1cd77cb9eab4065132b276af9696e98e0d652704 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 19 Oct 2023 15:26:23 +0530 Subject: [PATCH 161/831] JAVA-26001_N_P: Fix formatting of POMs for modules N to P (#14959) --- parent-spring-6/pom.xml | 4 +-- persistence-modules/pom.xml | 3 +-- .../spring-data-elasticsearch/pom.xml | 26 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/parent-spring-6/pom.xml b/parent-spring-6/pom.xml index 7b28afc9b1..7aaffb5483 100644 --- a/parent-spring-6/pom.xml +++ b/parent-spring-6/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 parent-spring-6 0.0.1-SNAPSHOT diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index f35b22a19d..a99a180390 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -35,7 +35,7 @@ hibernate-queries hibernate-enterprise influxdb - java-cassandra + java-cassandra java-cockroachdb java-jdbi java-jpa @@ -109,7 +109,6 @@ spring-mybatis spring-persistence-simple spring-data-yugabytedb - fauna spring-data-rest java-mongodb diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index a353f60ad2..6535b9ac4b 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -19,18 +19,18 @@ spring-data-elasticsearch ${spring-data-elasticsearch.version} - - - - - - - - - - - + + + + + + + + + + + org.elasticsearch.client @@ -47,6 +47,7 @@ spring-boot-autoconfigure + @@ -55,6 +56,7 @@ + 5.1.2 8.9.0 From ec26c2802c13019a0536bb5c83d3066402aef957 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:47:13 +0300 Subject: [PATCH 162/831] [JAVA-4584] Clean up (#15006) --- core-java-modules/pom.xml | 5 +++++ pom.xml | 10 ---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 8cfd67aed3..9bfd17125c 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -27,6 +27,11 @@ + + + + + core-java-9-improvements core-java-9-streams core-java-9 diff --git a/pom.xml b/pom.xml index c227fe09e7..517495d7b1 100644 --- a/pom.xml +++ b/pom.xml @@ -767,11 +767,6 @@ core-groovy-modules core-java-modules - - - - - custom-pmd data-structures ddd-contexts @@ -1045,11 +1040,6 @@ core-java-modules gcp-firebase - - - - - spring-aop spring-aop-2 custom-pmd From 3178d8cb59093b173301389f906a47295dcd73d2 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Thu, 19 Oct 2023 12:15:54 +0000 Subject: [PATCH 163/831] Get file size efficiently in Java (#14970) * Get file size efficiently in Java * Get file size efficiently in Java * Get file size efficiently in Java * Update FileSizeBenchmark.java --- .../sizebenchmark/FileSizeBenchmark.java | 67 +++++++++++++++++++ .../baeldung/size/JavaFileSizeUnitTest.java | 23 +++++++ 2 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java-io/src/main/java/com/baeldung/sizebenchmark/FileSizeBenchmark.java diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/sizebenchmark/FileSizeBenchmark.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/sizebenchmark/FileSizeBenchmark.java new file mode 100644 index 0000000000..5998b0be73 --- /dev/null +++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/sizebenchmark/FileSizeBenchmark.java @@ -0,0 +1,67 @@ +package com.baeldung.sizebenchmark; + +import org.apache.commons.io.FileUtils; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.channels.FileChannel; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.SingleShotTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.NANOSECONDS) +@Measurement(iterations = 3, time = 10, timeUnit = TimeUnit.NANOSECONDS) +public class FileSizeBenchmark { + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + + @Benchmark + public void getFileSizeUsingLengthMethod(Blackhole blackhole) throws Exception { + File file = new File("src/test/resources/size/sample_file_1.in"); + blackhole.consume(file.length()); + } + + @Benchmark + public void getFileSizeUsingFileInputStream(Blackhole blackhole) throws Exception { + try (FileInputStream fis = new FileInputStream("src/test/resources/size/sample_file_1.in")) { + long result = fis.getChannel().size(); + blackhole.consume(result); + } + + } + + @Benchmark + public void getFileSizeUsingInputStreamAndUrl(Blackhole blackhole) throws Exception { + File me = new File("src/test/resources/size/sample_file_1.in"); + URL url = me.toURI().toURL(); + + try (InputStream stream = url.openStream()) { + blackhole.consume(stream.available()); + } + } + + @Benchmark + public void getFileSizeUsingApacheCommon(Blackhole blackhole) { + File imageFile = new File("src/test/resources/size/sample_file_1.in"); + long size = FileUtils.sizeOf(imageFile); + blackhole.consume(size); + } + + @Benchmark + public void getFileSizeUsingFileChannel(Blackhole blackhole) throws IOException { + Path imageFilePath = Paths.get("src/test/resources/size/sample_file_1.in"); + try (FileChannel imageFileChannel = FileChannel.open(imageFilePath)) { + long imageFileSize = imageFileChannel.size(); + blackhole.consume(imageFileSize); + } + } +} diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java index 6b6197c7ce..d015f2602e 100644 --- a/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java +++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java @@ -3,7 +3,10 @@ package com.baeldung.size; import static org.junit.Assert.assertEquals; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.Paths; @@ -62,4 +65,24 @@ public class JavaFileSizeUnitTest { final long length = file.length(); return length; } + + @Test + public void whenGetFileSizeUsingFileInputStream_thenCorrect() throws IOException { + + try (FileInputStream fis = new FileInputStream(filePath)) { + long result = fis.getChannel().size(); + assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, result); + } + } + + @Test + public void whenGetFileSizeUsingUrlAndInputStream_thenCorrect() throws IOException { + + File file = new File(filePath); + URL url = file.toURI().toURL(); + + try (InputStream stream = url.openStream()) { + assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, stream.available()); + } + } } \ No newline at end of file From 5230638d73f6291c5fc8f0aeb1b343b51324e454 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:32:23 +0530 Subject: [PATCH 164/831] BAEL-7135 A Guide to Spring 6 JdbcClient API --- persistence-modules/spring-jdbc-2/pom.xml | 96 ++++++++++++++++ .../jdbcClient/JdbcClientDemoApplication.java | 14 +++ .../baeldung/jdbcClient/dao/StudentDao.java | 95 ++++++++++++++++ .../baeldung/jdbcClient/model/Student.java | 60 ++++++++++ .../model/StudentResultExtractor.java | 26 +++++ .../jdbcClient/model/StudentRowMapper.java | 20 ++++ .../application.properties | 5 + .../com.baeldung.jdbcClient/drop_student.sql | 1 + .../com.baeldung.jdbcClient/student.sql | 98 ++++++++++++++++ .../jdbcClient/JdbcClientUnitTest.java | 106 ++++++++++++++++++ .../src/test/resources/logback-test.xml | 12 ++ 11 files changed, 533 insertions(+) create mode 100644 persistence-modules/spring-jdbc-2/pom.xml create mode 100644 persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java create mode 100644 persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java create mode 100644 persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java create mode 100644 persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java create mode 100644 persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java create mode 100644 persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties create mode 100644 persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql create mode 100644 persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql create mode 100644 persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java create mode 100644 persistence-modules/spring-jdbc-2/src/test/resources/logback-test.xml diff --git a/persistence-modules/spring-jdbc-2/pom.xml b/persistence-modules/spring-jdbc-2/pom.xml new file mode 100644 index 0000000000..79c5ad100c --- /dev/null +++ b/persistence-modules/spring-jdbc-2/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + org.example + spring-jdbc-2 + 1.0-SNAPSHOT + spring-jdbc-2 + Demo project for Spring Jdbc + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + --enable-preview + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + false + + + + + + 17 + 3.2.0-SNAPSHOT + UTF-8 + + + \ No newline at end of file diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java new file mode 100644 index 0000000000..fe1a203eff --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.jdbcClient; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.jdbcClient") +public class JdbcClientDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(JdbcClientDemoApplication.class, args); + } +} diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java new file mode 100644 index 0000000000..4ca2046a0e --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java @@ -0,0 +1,95 @@ +package com.baeldung.jdbcClient.dao; + +import com.baeldung.jdbcClient.model.Student; +import com.baeldung.jdbcClient.model.StudentResultExtractor; +import com.baeldung.jdbcClient.model.StudentRowMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowCountCallbackHandler; +import org.springframework.jdbc.core.simple.JdbcClient; +import org.springframework.stereotype.Repository; + +import java.sql.Types; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Repository +public class StudentDao { + + private static final Logger logger = LoggerFactory.getLogger(StudentDao.class); + @Autowired + private JdbcClient jdbcClient; + + public Integer insertWithSetParamWithNamedParamAndSqlType(Student student) { + String sql = "INSERT INTO student (student_name, age, grade, gender, state)" + + "VALUES (:name, :age, :grade, :gender, :state)"; + Integer noOfrowsAffected = this.jdbcClient.sql(sql) + .param("name", student.getStudentName(), Types.VARCHAR) + .param("age", student.getAge(), Types.INTEGER) + .param("grade", student.getGrade(), Types.INTEGER) + .param("gender", student.getStudentGender(), Types.VARCHAR) + .param("state", student.getState(), Types.VARCHAR) + .update(); + logger.info("No. of rows affected: " + noOfrowsAffected); + return noOfrowsAffected; + } + + public List getStudentsOfGradeStateAndGenderWithPositionalParams(int grade, String state, String gender) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = ? and state = ? and gender = ?"; + return jdbcClient.sql(sql) + .param(grade) + .param(state) + .param(gender) + .query(new StudentRowMapper()).list(); + } + + public List getStudentsOfGradeStateAndGenderWithParamIndex(int grade, String state, String gender) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = ? and state = ? and gender = ?"; + return jdbcClient.sql(sql) + .param(1,grade) + .param(2, state) + .param(3, gender) + .query(new StudentResultExtractor()); + } + + public Student getStudentsOfGradeStateAndGenderWithParamsInVarargs(int grade, String state, String gender) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = ? and state = ? and gender = ? limit 1"; + return jdbcClient.sql(sql) + .params(grade, state, gender) + .query(new StudentRowMapper()).single(); + } + + public Optional getStudentsOfGradeStateAndGenderWithParamsInList(List params) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = ? and state = ? and gender = ? limit 1"; + return jdbcClient.sql(sql) + .params(params) + .query(new StudentRowMapper()).optional(); + } + + + public int getCountOfStudentsOfGradeStateAndGenderWithNamedParam(int grade, String state, String gender) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = :grade and state = :state and gender = :gender"; + RowCountCallbackHandler countCallbackHandler = new RowCountCallbackHandler(); + jdbcClient.sql(sql) + .param("grade", grade) + .param("state", state) + .param("gender", gender) + .query(countCallbackHandler); + return countCallbackHandler.getRowCount(); + } + + public List getStudentsOfGradeStateAndGenderWithParamMap(Map paramMap) { + String sql = "select student_id, student_name, age, grade, gender, state from student" + + " where grade = :grade and state = :state and gender = :gender"; + return jdbcClient.sql(sql) + .params(paramMap) + .query(new StudentRowMapper()).list(); + } +} diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java new file mode 100644 index 0000000000..2e4ff69464 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java @@ -0,0 +1,60 @@ +package com.baeldung.jdbcClient.model; + +public class Student { + private Integer studentId; + private String studentName; + private String studentGender; + private Integer age; + private Integer grade; + + public Integer getStudentId() { + return studentId; + } + + public void setStudentId(Integer studentId) { + this.studentId = studentId; + } + + public String getStudentName() { + return studentName; + } + + public void setStudentName(String studentName) { + this.studentName = studentName; + } + + public String getStudentGender() { + return studentGender; + } + + public void setStudentGender(String studentGender) { + this.studentGender = studentGender; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Integer getGrade() { + return grade; + } + + public void setGrade(Integer grade) { + this.grade = grade; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + private String state; + +} diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java new file mode 100644 index 0000000000..2bc8a249c5 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java @@ -0,0 +1,26 @@ +package com.baeldung.jdbcClient.model; + +import org.springframework.jdbc.core.ResultSetExtractor; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class StudentResultExtractor implements ResultSetExtractor> { + @Override + public List extractData(ResultSet rs) throws SQLException { + List students = new ArrayList(); + while(rs.next()) { + Student student = new Student(); + student.setStudentId(rs.getInt("student_id")); + student.setStudentName(rs.getString("student_name")); + student.setAge(rs.getInt("age")); + student.setStudentGender(rs.getString("gender")); + student.setGrade(rs.getInt("grade")); + student.setState(rs.getString("state")); + students.add(student); + } + return students; + } +} diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java new file mode 100644 index 0000000000..22a98e0efa --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java @@ -0,0 +1,20 @@ +package com.baeldung.jdbcClient.model; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class StudentRowMapper implements RowMapper { + @Override + public Student mapRow(ResultSet rs, int rowNum) throws SQLException { + Student student = new Student(); + student.setStudentId(rs.getInt("student_id")); + student.setStudentName(rs.getString("student_name")); + student.setAge(rs.getInt("age")); + student.setStudentGender(rs.getString("gender")); + student.setGrade(rs.getInt("grade")); + student.setState(rs.getString("state")); + return student; + } +} diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties new file mode 100644 index 0000000000..04c963ebf4 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties @@ -0,0 +1,5 @@ +# DataSource Configuration +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=user +spring.datasource.password= # Leave this empty \ No newline at end of file diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql new file mode 100644 index 0000000000..954545a862 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql @@ -0,0 +1 @@ +DROP TABLE student; \ No newline at end of file diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql new file mode 100644 index 0000000000..0e137f5445 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql @@ -0,0 +1,98 @@ + +CREATE TABLE student ( + student_id INT AUTO_INCREMENT PRIMARY KEY, + student_name VARCHAR(255) NOT NULL, + age INT, + grade INT NOT NULL, + gender VARCHAR(10) NOT NULL, + state VARCHAR(100) NOT NULL +); +-- Student 1 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('John Smith', 18, 3, 'Male', 'California'); + +-- Student 2 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Emily Johnson', 17, 2, 'Female', 'New York'); + +-- Student 3 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Michael Davis', 4, 1, 'Male', 'Texas'); + +-- Student 4 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Sophia Martinez', 2, 1, 'Female', 'Florida'); + +-- Student 5 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('William Brown', 5, 5, 'Male', 'California'); + +-- Student 6 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Olivia Garcia', 4, 2, 'Female', 'Texas'); + +-- Student 7 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Ethan Rodriguez', 3, 1, 'Male', 'New York'); + +-- Student 8 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Ava Hernandez', 2, 1, 'Female', 'Florida'); + +-- Student 9 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('James Wilson', 5, 4, 'Male', 'Texas'); + +-- Student 10 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Emma Miller', 3, 1, 'Female', 'California'); + +-- Student 11 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Benjamin Brown', 4, 1, 'Male', 'New York'); + +-- Student 12 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Mia Smith', 2, 1, 'Female', 'Florida'); + +-- Student 13 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Daniel Johnson', 5, 4, 'Male', 'California'); + +-- Student 14 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Ava Davis', 4, 2, 'Female', 'Texas'); + +-- Student 15 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Matthew Martinez', 3, 1, 'Male', 'New York'); + +-- Student 16 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Sophia Taylor', 2, 1, 'Female', 'Florida'); + +-- Student 17 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Alexander White', 5, 4, 'Male', 'California'); + +-- Student 18 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Olivia Johnson', 4, 2, 'Female', 'Texas'); + +-- Student 19 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Christopher Lee', 3, 1, 'Male', 'New York'); + +-- Student 20 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Emma Wilson', 2, 1, 'Female', 'Florida'); + +-- Student 21 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Elijah Smith', 5, 3, 'Male', 'Texas'); + +-- Student 22 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Isabella Davis', 4, 2, 'Female', 'California'); + +-- Student 23 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Liam Johnson', 3, 1, 'Male', 'New York'); + +-- Student 24 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Olivia Garcia', 2, 1, 'Female', 'Florida'); + +-- Student 25 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Noah Rodriguez', 5, 3, 'Male', 'Texas'); + +-- Student 26 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Sophia Hernandez', 4, 2, 'Female', 'California'); + +-- Student 27 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Mason Smith', 3, 1, 'Male', 'New York'); + +-- Student 28 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Ava Taylor', 2, 1, 'Female', 'Florida'); + +-- Student 29 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('William Brown', 5, 5, 'Male', 'Texas'); + +-- Student 30 +INSERT INTO student (student_name, age, grade, gender, state) VALUES ('Olivia Martinez', 4, 4, 'Female', 'California'); diff --git a/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java new file mode 100644 index 0000000000..b07a3c16f0 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java @@ -0,0 +1,106 @@ +package com.baeldung.jdbcClient; + +import com.baeldung.jdbcClient.dao.StudentDao; +import com.baeldung.jdbcClient.model.Student; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@RunWith(SpringRunner.class) +@Sql(value = "/com.baeldung.jdbcClient/student.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(value = "/com.baeldung.jdbcClient/drop_student.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +@SpringBootTest(classes = JdbcClientDemoApplication.class) +@TestPropertySource(locations = {"classpath:com.baeldung.jdbcClient/application.properties"}) +public class JdbcClientUnitTest { + private static final Logger logger = LoggerFactory.getLogger(JdbcClientUnitTest.class); + + @Autowired + private StudentDao studentDao; + + @Test + public void givenJdbcClient_whenInsertWithNamedParamAndSqlType_thenSuccess() { + logger.info("testing invoked successfully"); + Student student = getSampleStudent("Johny Dep", 8, 4, "Male", "New York"); + assertEquals(1, studentDao.insertWithSetParamWithNamedParamAndSqlType(student)); + } + + @Test + public void givenJdbcClient_whenQueryWithPositionalParams_thenSuccess() { + logger.info("testing invoked successfully"); + List students = studentDao.getStudentsOfGradeStateAndGenderWithPositionalParams( + 1, "New York", "Male"); + logger.info("number of students fetched " + students.size()); + assertEquals(6, students.size()); + } + + @Test + public void givenJdbcClient_whenQueryWithParamsInVarargs_thenSuccess() { + logger.info("testing invoked successfully"); + Student student = studentDao.getStudentsOfGradeStateAndGenderWithParamsInVarargs( + 1, "New York", "Male"); + assertNotNull(student); + } + + @Test + public void givenJdbcClient_whenQueryWithParamsInList_thenSuccess() { + logger.info("testing invoked successfully"); + List params = List.of(1, "New York", "Male"); + Optional optional = studentDao.getStudentsOfGradeStateAndGenderWithParamsInList(params); + if(optional.isPresent()) { + assertNotNull(optional.get()); + } else { + assertThrows(NoSuchElementException.class, () -> optional.get()); + } + } + + @Test + public void givenJdbcClient_whenQueryWithParamsIndex_thenSuccess() { + logger.info("testing invoked successfully"); + List students = studentDao.getStudentsOfGradeStateAndGenderWithParamIndex( + 1, "New York", "Male"); + assertEquals(6, students.size()); + } + @Test + public void givenJdbcClient_whenQueryWithNamedParam_thenSuccess() { + logger.info("testing invoked successfully"); + Integer count = studentDao.getCountOfStudentsOfGradeStateAndGenderWithNamedParam( + 1, "New York", "Male"); + logger.info("number of students fetched " + count); + assertEquals(6, count); + } + @Test + public void givenJdbcClient_whenQueryWithParamMap_thenSuccess() { + logger.info("testing invoked successfully"); + Map paramMap = Map.of( + "grade", 1, + "gender", "Male", + "state", "New York" + ); + List students = studentDao.getStudentsOfGradeStateAndGenderWithParamMap(paramMap); + logger.info("number of students fetched " + students.size()); + assertEquals(6, students.size()); + } + + private Student getSampleStudent(String name, int age, int grade, String gender, String state) { + Student student = new Student(); + student.setStudentName(name); + student.setStudentGender(gender); + student.setAge(age); + student.setGrade(grade); + student.setState(state); + return student; + } +} diff --git a/persistence-modules/spring-jdbc-2/src/test/resources/logback-test.xml b/persistence-modules/spring-jdbc-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file From 1071a071706b8ed306153628d9610a91cf4de82a Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Thu, 19 Oct 2023 19:33:27 +0530 Subject: [PATCH 165/831] JAVA-18764: Changes made for updating the pkg --- .../cassecuredapp/CasSecuredApplication.java | 15 +++------------ .../baeldung/cassecuredapp/UserRepository.java | 15 --------------- .../CasUserDetailsService.java} | 18 ++++++++++-------- .../{Users.java => user/User.java} | 4 ++-- .../cassecuredapp/user/UserRepository.java | 14 ++++++++++++++ 5 files changed, 29 insertions(+), 37 deletions(-) delete mode 100644 security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java rename security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/{MyUserDetailsService.java => service/CasUserDetailsService.java} (63%) rename security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/{Users.java => user/User.java} (91%) create mode 100644 security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java index 9293a3e00f..84bbd2ace4 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java @@ -1,30 +1,21 @@ package com.baeldung.cassecuredapp; import org.jasig.cas.client.session.SingleSignOutFilter; -import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.validation.Cas30ServiceTicketValidator; import org.jasig.cas.client.validation.TicketValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.context.event.EventListener; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.cas.ServiceProperties; import org.springframework.security.cas.authentication.CasAuthenticationProvider; -import org.springframework.security.cas.web.CasAuthenticationEntryPoint; import org.springframework.security.cas.web.CasAuthenticationFilter; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; -import javax.servlet.http.HttpSessionEvent; +import com.baeldung.cassecuredapp.service.CasUserDetailsService; @SpringBootApplication public class CasSecuredApplication { @@ -61,8 +52,8 @@ public class CasSecuredApplication { } @Bean - public MyUserDetailsService getUser(){ - return new MyUserDetailsService(); + public CasUserDetailsService getUser(){ + return new CasUserDetailsService(); } @Bean public CasAuthenticationProvider casAuthenticationProvider( diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java deleted file mode 100644 index 366329a3fb..0000000000 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/UserRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.cassecuredapp; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface UserRepository extends CrudRepository { - - Users findByEmail(@Param("email") String email); - -} diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java similarity index 63% rename from security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java rename to security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java index 35c83bfd75..ac4fef1ff0 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/MyUserDetailsService.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java @@ -1,15 +1,17 @@ -package com.baeldung.cassecuredapp; +package com.baeldung.cassecuredapp.service; import java.util.Collections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; -public class MyUserDetailsService implements UserDetailsService { +import com.baeldung.cassecuredapp.user.User; +import com.baeldung.cassecuredapp.user.UserRepository; + +public class CasUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @@ -17,18 +19,18 @@ public class MyUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // Get the user from the database. - Users users = getUserFromDatabase(username); + User user = getUserFromDatabase(username); // Create a UserDetails object. - UserDetails userDetails = new User( - users.getEmail(), - users.getPassword(), + UserDetails userDetails = new org.springframework.security.core.userdetails.User( + user.getEmail(), + user.getPassword(), Collections.singletonList(new SimpleGrantedAuthority("ROLE_ADMIN"))); return userDetails; } - private Users getUserFromDatabase(String username) { + private User getUserFromDatabase(String username) { return userRepository.findByEmail(username); } } diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java similarity index 91% rename from security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java rename to security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java index 4e775e80e3..1dddc11458 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/Users.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java @@ -1,11 +1,11 @@ -package com.baeldung.cassecuredapp; +package com.baeldung.cassecuredapp.user; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @Entity -public class Users { +public class User { @Id private Long id; diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java new file mode 100644 index 0000000000..0481fabb06 --- /dev/null +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.cassecuredapp.user; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.baeldung.cassecuredapp.user.User; + +@Repository +public interface UserRepository extends CrudRepository { + + User findByEmail(@Param("email") String email); + +} From e46cc0443294523c6544e8ca85fb92ed912480af Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:58:43 +0530 Subject: [PATCH 166/831] BAEL-7135 A Guide to Spring 6 JdbcClient API --- persistence-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index f35b22a19d..867c12291a 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -105,6 +105,7 @@ spring-jpa spring-jpa-2 spring-jdbc + spring-jdbc-2 spring-jooq spring-mybatis spring-persistence-simple From 94d1847f9d1ff5ae13aec00094cf15967c84fa7a Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:09:34 +0530 Subject: [PATCH 167/831] BAEL-7135 A Guide to Spring 6 JdbcClient API --- persistence-modules/spring-jdbc-2/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/persistence-modules/spring-jdbc-2/pom.xml b/persistence-modules/spring-jdbc-2/pom.xml index 79c5ad100c..24744b28dc 100644 --- a/persistence-modules/spring-jdbc-2/pom.xml +++ b/persistence-modules/spring-jdbc-2/pom.xml @@ -44,9 +44,6 @@ org.apache.maven.plugins maven-compiler-plugin - - --enable-preview - @@ -88,7 +85,6 @@ - 17 3.2.0-SNAPSHOT UTF-8 From e3e95fbc82a571497e6a453777405cad385901c5 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Thu, 19 Oct 2023 19:30:55 +0200 Subject: [PATCH 168/831] BAEL - 6715 (#15024) * BAEL-6715: Fixed Indentation * BAEL-6715: Changed Lists to Streams * BAEL-6715: Inlined skip methods in the tests --- .../skippingelements/SkippingCollector.java | 6 +- .../skippingelements/SkippingElements.java | 65 --------------- .../SkippingElementsUnitTest.java | 81 +++++++++++++------ 3 files changed, 62 insertions(+), 90 deletions(-) delete mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java index 8f36550bdc..c6530f4940 100644 --- a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingCollector.java @@ -6,19 +6,23 @@ import java.util.function.BinaryOperator; import java.util.stream.Collector; class SkippingCollector { + private static final BinaryOperator IGNORE_COMBINE = (a, b) -> a; private final int skip; private final List list = new ArrayList<>(); private int currentIndex = 0; + private SkippingCollector(int skip) { this.skip = skip; } private void accept(String item) { final int index = ++currentIndex % skip; - if (index == 0) + if (index == 0) { list.add(item); + } } + private List getResult() { return list; } diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java deleted file mode 100644 index eb382367cc..0000000000 --- a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/skippingelements/SkippingElements.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.skippingelements; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -public class SkippingElements { - - private SkippingElements() { - } - - public static List skipNthElementInListWithFilter(List sourceList, int n) { -return IntStream.range(0, sourceList.size()) - .filter(s -> (s + 1) % n == 0) - .mapToObj(sourceList::get) - .collect(Collectors.toList()); - } - - public static List skipNthElementInListWithIterate(List sourceList, int n) { -int limit = sourceList.size() / n; -return IntStream.iterate(n - 1, i -> (i + n)) - .limit(limit) - .mapToObj(sourceList::get) - .collect(Collectors.toList()); - } - - public static List skipNthElementInListWithSublist(List sourceList, int n) { -int limit = sourceList.size() / n; -return Stream.iterate(sourceList, s -> s.subList(n, s.size())) - .limit(limit) - .map(s -> s.get(n - 1)) - .collect(Collectors.toList()); - } - - public static List skipNthElementInListWithFor(List sourceList, int n) { -List result = new ArrayList<>(); -for (int i = n - 1; i < sourceList.size(); i += n) { - result.add(sourceList.get(i)); -} -return result; - } - - public static List skipNthElementInListWithIterator(Stream sourceStream, int n) { -List result = new ArrayList<>(); -final Iterator iterator = sourceStream.iterator(); -int count = 0; -while (iterator.hasNext()) { - if (count % n == n - 1) { - result.add(iterator.next()); - } else { - iterator.next(); - } - ++count; -} -return result; - } - -public static List skipNthElementInStreamWithCollector(Stream sourceStream, int n) { - return sourceStream.collect(SkippingCollector.collector(n)); -} - -} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java index 2fd6adb0cf..92a13e62ab 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/skippingelements/SkippingElementsUnitTest.java @@ -3,7 +3,11 @@ package com.baeldung.skippingelements; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -14,21 +18,22 @@ class SkippingElementsUnitTest { private static Stream testSource() { return Stream.of( Arguments.of( - List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + Stream.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", "Thirty One", "Thirty Two", "Thirty Three"), - List.of("Three", "Six", "Nine", "Twelve", "Fifteen", "Eighteen", "Twenty One", "Twenty Four", "Twenty Seven", "Thirty", "Thirty Three"), + List.of("Three", "Six", "Nine", "Twelve", "Fifteen", "Eighteen", "Twenty One", "Twenty Four", "Twenty Seven", "Thirty", + "Thirty Three"), 3), Arguments.of( - List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + Stream.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", "Thirty One", "Thirty Two", "Thirty Three"), List.of("Five", "Ten", "Fifteen", "Twenty", "Twenty Five", "Thirty"), 5), Arguments.of( - List.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", + Stream.of("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Twenty One", "Twenty Two", "Twenty Three", "Twenty Four", "Twenty Five", "Twenty Six", "Twenty Seven", "Twenty Eight", "Twenty Nine", "Thirty", "Thirty One", "Thirty Two", "Thirty Three"), @@ -38,29 +43,29 @@ class SkippingElementsUnitTest { "Thirty One", "Thirty Two", "Thirty Three"), 1), Arguments.of( - List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + Stream.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), List.of("Wednesday", "Saturday"), 3), Arguments.of( - List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + Stream.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), List.of("Friday"), 5), Arguments.of( - List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), + Stream.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), List.of("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"), 1), Arguments.of( - List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + Stream.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), List.of("March", "June", "September", "December"), 3), Arguments.of( - List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + Stream.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), List.of("May", "October"), 5), Arguments.of( - List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", + Stream.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), List.of("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), @@ -70,45 +75,73 @@ class SkippingElementsUnitTest { @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInListWithFilterTestShouldFilterNthElement(List input, List expected, int n) { - final List actual = SkippingElements.skipNthElementInListWithFilter(input, n); + void givenListSkipNthElementInListWithFilterTestShouldFilterNthElement(Stream input, List expected, int n) { + final List sourceList = input.collect(Collectors.toList()); + final List actual = IntStream.range(0, sourceList.size()) + .filter(s -> (s + 1) % n == 0) + .mapToObj(sourceList::get) + .collect(Collectors.toList()); assertEquals(expected, actual); } @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInListWithIterateTestShouldFilterNthElement(List input, List expected, int n) { - final List actual = SkippingElements.skipNthElementInListWithIterate(input, n); + void givenListSkipNthElementInListWithIterateTestShouldFilterNthElement(Stream input, List expected, int n) { + final List sourceList = input.collect(Collectors.toList()); + int limit = sourceList.size() / n; + final List actual = IntStream.iterate(n - 1, i -> (i + n)) + .limit(limit) + .mapToObj(sourceList::get) + .collect(Collectors.toList()); assertEquals(expected, actual); } @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInListWithSublistTestShouldFilterNthElement(List input, List expected, int n) { - final List actual = SkippingElements.skipNthElementInListWithSublist(input, n); + void givenListSkipNthElementInListWithSublistTestShouldFilterNthElement(Stream input, List expected, int n) { + final List sourceList = input.collect(Collectors.toList()); + int limit = sourceList.size() / n; + final List actual = Stream.iterate(sourceList, s -> s.subList(n, s.size())) + .limit(limit) + .map(s -> s.get(n - 1)) + .collect(Collectors.toList()); assertEquals(expected, actual); } @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInListWithForTestShouldFilterNthElement(List input, List expected, int n) { - final List actual = SkippingElements.skipNthElementInListWithFor(input, n); + void givenListSkipNthElementInListWithForTestShouldFilterNthElement(Stream input, List expected, int n) { + final List sourceList = input.collect(Collectors.toList()); + List result = new ArrayList<>(); + for (int i = n - 1; i < sourceList.size(); i += n) { + result.add(sourceList.get(i)); + } + final List actual = result; assertEquals(expected, actual); } @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInStreamWithIteratorTestShouldFilterNthElement(List input, List expected, int n) { - final Stream inputStream = input.stream(); - final List actual = SkippingElements.skipNthElementInListWithIterator(inputStream, n); + void givenListSkipNthElementInStreamWithIteratorTestShouldFilterNthElement(Stream input, List expected, int n) { + List result = new ArrayList<>(); + final Iterator iterator = input.iterator(); + int count = 0; + while (iterator.hasNext()) { + if (count % n == n - 1) { + result.add(iterator.next()); + } else { + iterator.next(); + } + ++count; + } + final List actual = result; assertEquals(expected, actual); } @ParameterizedTest @MethodSource("testSource") - void givenListSkipNthElementInStreamWithCollectorShouldFilterNthElement(List input, List expected, int n) { - final Stream inputStream = input.stream(); - final List actual = SkippingElements.skipNthElementInStreamWithCollector(inputStream, n); + void givenListSkipNthElementInStreamWithCollectorShouldFilterNthElement(Stream input, List expected, int n) { + final List actual = input.collect(SkippingCollector.collector(n)); assertEquals(expected, actual); } } \ No newline at end of file From fdca014527b65acbf6fa47f4d6b24d12f53263a9 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 20 Oct 2023 02:24:07 +0200 Subject: [PATCH 169/831] [impr-list-of-lists] The size of list of lists (#15002) --- .../list/listoflists/ListOfListsUnitTest.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java index 321fa475f6..f75ca453ea 100644 --- a/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java +++ b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/listoflists/ListOfListsUnitTest.java @@ -71,4 +71,15 @@ public class ListOfListsUnitTest { assertThat(listOfLists.get(2)).containsExactly("Slack", "Zoom", "Microsoft Teams", "Telegram"); printListOfLists(listOfLists); } -} + + @Test + void givenListOfLists_whenGettingSizeOfSubListsAndSizeOfElements_thenGetExpectedResults() throws URISyntaxException, IOException { + List> listOfLists = getListOfListsFromCsv(); + // size of inner lists + assertThat(listOfLists).hasSize(3); + + // size of all elements in subLists + int totalElements = listOfLists.stream().mapToInt(List::size).sum(); + assertThat(totalElements).isEqualTo(12); + } +} \ No newline at end of file From 8f3b5ecc2b1ab7604607eb34e9de0eca068636f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Wacongne?= Date: Fri, 20 Oct 2023 05:41:41 +0200 Subject: [PATCH 170/831] spring-boot 3.1 and spring-addons 7.1.10 (#14902) --- .../spring-security-oauth2-testing/pom.xml | 2 +- .../ReactiveResourceServerApplication.java | 92 +++++++++-------- .../com/baeldung/MessageServiceUnitTest.java | 57 ++++++++--- ...ourceServerApplicationIntegrationTest.java | 14 +-- ...pringAddonsGreetingControllerUnitTest.java | 98 +++++++------------ .../src/test/resources/ch4mpy.json | 15 +++ .../src/test/resources/tonton-pirate.json | 15 +++ .../ServletResourceServerApplication.java | 62 ++++++------ .../com/baeldung/MessageServiceUnitTest.java | 56 ++++++++--- ...ourceServerApplicationIntegrationTest.java | 14 +-- ...pringAddonsGreetingControllerUnitTest.java | 23 +++-- .../src/test/resources/ch4mpy.json | 15 +++ .../src/test/resources/tonton-pirate.json | 15 +++ 13 files changed, 289 insertions(+), 189 deletions(-) create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/ch4mpy.json create mode 100644 spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/tonton-pirate.json create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/ch4mpy.json create mode 100644 spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/tonton-pirate.json diff --git a/spring-security-modules/spring-security-oauth2-testing/pom.xml b/spring-security-modules/spring-security-oauth2-testing/pom.xml index 93348cb48c..45fcf9bcce 100644 --- a/spring-security-modules/spring-security-oauth2-testing/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/pom.xml @@ -14,7 +14,7 @@ ../../parent-boot-3 - 6.1.0 + 7.1.10 diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java index 500d876bc4..716900ea51 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/main/java/com/baeldung/ReactiveResourceServerApplication.java @@ -1,7 +1,8 @@ package com.baeldung; +import static org.springframework.security.config.Customizer.withDefaults; + import java.nio.charset.Charset; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -27,6 +28,7 @@ import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.oauth2.core.oidc.StandardClaimNames; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverter; import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.security.web.server.context.NoOpServerSecurityContextRepository; import org.springframework.stereotype.Service; @@ -34,6 +36,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @SpringBootApplication @@ -46,68 +49,66 @@ public class ReactiveResourceServerApplication { @Configuration @EnableWebFluxSecurity @EnableReactiveMethodSecurity - public class SecurityConfig { + static class SecurityConfig { @Bean - SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http, Converter>> authoritiesConverter) { - http.oauth2ResourceServer() - .jwt() - .jwtAuthenticationConverter(jwt -> authoritiesConverter.convert(jwt) - .map(authorities -> new JwtAuthenticationToken(jwt, authorities))); - http.securityContextRepository(NoOpServerSecurityContextRepository.getInstance()) - .csrf() - .disable(); - http.exceptionHandling() - .accessDeniedHandler((var exchange, var ex) -> exchange.getPrincipal() - .flatMap(principal -> { + SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(withDefaults())); + http.securityContextRepository(NoOpServerSecurityContextRepository.getInstance()); + http.csrf(csrf -> csrf.disable()); + http.exceptionHandling(eh -> eh + .accessDeniedHandler((var exchange, var ex) -> exchange.getPrincipal().flatMap(principal -> { final var response = exchange.getResponse(); - response.setStatusCode(principal instanceof AnonymousAuthenticationToken ? HttpStatus.UNAUTHORIZED : HttpStatus.FORBIDDEN); - response.getHeaders() - .setContentType(MediaType.TEXT_PLAIN); + response.setStatusCode( + principal instanceof AnonymousAuthenticationToken ? HttpStatus.UNAUTHORIZED + : HttpStatus.FORBIDDEN); + response.getHeaders().setContentType(MediaType.TEXT_PLAIN); final var dataBufferFactory = response.bufferFactory(); - final var buffer = dataBufferFactory.wrap(ex.getMessage() - .getBytes(Charset.defaultCharset())); + final var buffer = dataBufferFactory.wrap(ex.getMessage().getBytes(Charset.defaultCharset())); return response.writeWith(Mono.just(buffer)) - .doOnError(error -> DataBufferUtils.release(buffer)); - })); + .doOnError(error -> DataBufferUtils.release(buffer)); + }))); - http.authorizeExchange() - .pathMatchers("/secured-route") - .hasRole("AUTHORIZED_PERSONNEL") - .anyExchange() - .authenticated(); + // @formatter:off + http.authorizeExchange(req -> req + .pathMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL").anyExchange() + .authenticated()); + // @formatter:on return http.build(); } - static interface AuthoritiesConverter extends Converter>> { + static interface ReactiveJwtAuthoritiesConverter extends Converter> { } @Bean - AuthoritiesConverter realmRoles2AuthoritiesConverter() { + ReactiveJwtAuthoritiesConverter realmRoles2AuthoritiesConverter() { return (Jwt jwt) -> { - final var realmRoles = Optional.of(jwt.getClaimAsMap("realm_access")) - .orElse(Map.of()); + final var realmRoles = Optional.of(jwt.getClaimAsMap("realm_access")).orElse(Map.of()); @SuppressWarnings("unchecked") final var roles = (List) realmRoles.getOrDefault("roles", List.of()); - return Mono.just(roles.stream() - .map(SimpleGrantedAuthority::new) - .map(GrantedAuthority.class::cast) - .toList()); + return Flux.fromStream(roles.stream()).map(SimpleGrantedAuthority::new) + .map(GrantedAuthority.class::cast); }; } + + @Bean + ReactiveJwtAuthenticationConverter authenticationConverter( + Converter> authoritiesConverter) { + final var authenticationConverter = new ReactiveJwtAuthenticationConverter(); + authenticationConverter.setPrincipalClaimName(StandardClaimNames.PREFERRED_USERNAME); + authenticationConverter.setJwtGrantedAuthoritiesConverter(authoritiesConverter); + return authenticationConverter; + } } @Service public static class MessageService { public Mono greet() { - return ReactiveSecurityContextHolder.getContext() - .map(ctx -> { - final var who = (JwtAuthenticationToken) ctx.getAuthentication(); - final var claims = who.getTokenAttributes(); - return "Hello %s! You are granted with %s.".formatted(claims.getOrDefault(StandardClaimNames.PREFERRED_USERNAME, claims.get(StandardClaimNames.SUB)), who.getAuthorities()); - }) - .switchIfEmpty(Mono.error(new AuthenticationCredentialsNotFoundException("Security context is empty"))); + return ReactiveSecurityContextHolder.getContext().map(ctx -> { + final var who = (JwtAuthenticationToken) ctx.getAuthentication(); + return "Hello %s! You are granted with %s.".formatted(who.getName(), who.getAuthorities()); + }).switchIfEmpty(Mono.error(new AuthenticationCredentialsNotFoundException("Security context is empty"))); } @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") @@ -118,26 +119,23 @@ public class ReactiveResourceServerApplication { @RestController @RequiredArgsConstructor - public class GreetingController { + public static class GreetingController { private final MessageService messageService; @GetMapping("/greet") public Mono> greet() { - return messageService.greet() - .map(ResponseEntity::ok); + return messageService.greet().map(ResponseEntity::ok); } @GetMapping("/secured-route") public Mono> securedRoute() { - return messageService.getSecret() - .map(ResponseEntity::ok); + return messageService.getSecret().map(ResponseEntity::ok); } @GetMapping("/secured-method") @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") public Mono> securedMethod() { - return messageService.getSecret() - .map(ResponseEntity::ok); + return messageService.getSecret().map(ResponseEntity::ok); } } diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java index 97893bc1fb..c13a20ca38 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java @@ -3,28 +3,49 @@ package com.baeldung; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.stream.Stream; + import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; -import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.oidc.StandardClaimNames; +import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import com.baeldung.ReactiveResourceServerApplication.MessageService; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.baeldung.ReactiveResourceServerApplication.SecurityConfig; +import com.c4_soft.springaddons.security.oauth2.test.AuthenticationFactoriesTestConf; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication; -@Import({ MessageService.class }) +@Import({ MessageService.class, SecurityConfig.class }) +@ImportAutoConfiguration(AuthenticationFactoriesTestConf.class) @ExtendWith(SpringExtension.class) -@EnableReactiveMethodSecurity +@TestInstance(Lifecycle.PER_CLASS) class MessageServiceUnitTest { @Autowired MessageService messageService; + @Autowired + WithJwt.AuthenticationFactory authFactory; + + @MockBean + ReactiveJwtDecoder jwtDecoder; + /*----------------------------------------------------------------------------*/ /* greet() */ /* Expects a JwtAuthenticationToken to be retrieved from the security-context */ @@ -43,10 +64,12 @@ class MessageServiceUnitTest { .block()); } - @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenSecurityContextIsPopulatedWithJwtAuthenticationToken_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities() { - assertEquals("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].", messageService.greet() + @ParameterizedTest + @MethodSource("allIdentities") + void givenUserIsAuthenticated_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities(@ParameterizedAuthentication Authentication auth) { + final var jwt = (JwtAuthenticationToken) auth; + final var expected = "Hello %s! You are granted with %s.".formatted(jwt.getTokenAttributes().get(StandardClaimNames.PREFERRED_USERNAME), auth.getAuthorities()); + assertEquals(expected, messageService.greet() .block()); } @@ -70,17 +93,25 @@ class MessageServiceUnitTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() { + @WithJwt("ch4mpy.json") + void givenUserIsCh4mpy_whenGetSecret_thenReturnSecret() { assertEquals("Only authorized personnel can read that", messageService.getSecret() .block()); } @Test - @WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() { + @WithJwt("tonton-pirate.json") + void givenUserIsTontonPirate_whenGetSecret_thenThrowsAccessDeniedException() { assertThrows(AccessDeniedException.class, () -> messageService.getSecret() .block()); } + /*--------------------------------------------*/ + /* methodSource returning all test identities */ + /*--------------------------------------------*/ + private Stream allIdentities() { + final var authentications = authFactory.authenticationsFrom("ch4mpy.json", "tonton-pirate.json").toList(); + return authentications.stream(); + } + } diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java index 1ee6fc7e87..d6bfbf4e2d 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/ReactiveResourceServerApplicationIntegrationTest.java @@ -8,8 +8,8 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.test.web.reactive.server.WebTestClient; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication; @SpringBootTest(webEnvironment = WebEnvironment.MOCK) @AutoConfigureWebTestClient @@ -33,7 +33,7 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithJwt("ch4mpy.json") void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { api.get() .uri("/greet") @@ -60,7 +60,7 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { api.get() .uri("/secured-route") @@ -72,7 +72,7 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { api.get() .uri("/secured-route") @@ -97,7 +97,7 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { api.get() .uri("/secured-method") @@ -109,7 +109,7 @@ class ReactiveResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { api.get() .uri("/secured-method") diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java index 6f55f287d8..f31bbe3ae8 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java @@ -5,16 +5,19 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.core.Authentication; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.test.web.reactive.server.WebTestClient; import com.baeldung.ReactiveResourceServerApplication.GreetingController; import com.baeldung.ReactiveResourceServerApplication.MessageService; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.AuthenticationSource; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication; import reactor.core.publisher.Mono; @@ -28,115 +31,88 @@ class SpringAddonsGreetingControllerUnitTest { WebTestClient api; /*-----------------------------------------------------------------------------*/ - /* /greet */ - /* This end-point secured with ".anyRequest().authenticated()" in SecurityConf */ + /* /greet */ + /* + * This end-point secured with ".anyRequest().authenticated()" in SecurityConf + */ /*-----------------------------------------------------------------------------*/ @Test @WithAnonymousUser void givenRequestIsAnonymous_whenGetGreet_thenUnauthorized() throws Exception { - api.get() - .uri("/greet") - .exchange() - .expectStatus() - .isUnauthorized(); + api.get().uri("/greet").exchange().expectStatus().isUnauthorized(); } - @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + @ParameterizedTest + @AuthenticationSource({ + @WithMockAuthentication(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, name = "ch4mpy"), + @WithMockAuthentication(authorities = { "uncle", "PIRATE" }, name = "tonton-pirate") }) + void givenUserIsAuthenticated_whenGetGreet_thenOk(@ParameterizedAuthentication Authentication auth) throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(Mono.just(greeting)); - api.get() - .uri("/greet") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo(greeting); + api.get().uri("/greet").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo(greeting); verify(messageService, times(1)).greet(); } /*---------------------------------------------------------------------------------------------------------------------*/ - /* /secured-route */ - /* This end-point is secured with ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in SecurityConf */ + /* /secured-route */ + /* + * This end-point is secured with + * ".requestMatchers("/secured-route").hasRole("AUTHORIZED_PERSONNEL")" in + * SecurityConf + */ /*---------------------------------------------------------------------------------------------------------------------*/ @Test @WithAnonymousUser void givenRequestIsAnonymous_whenGetSecuredRoute_thenUnauthorized() throws Exception { - api.get() - .uri("/secured-route") - .exchange() - .expectStatus() - .isUnauthorized(); + api.get().uri("/secured-route").exchange().expectStatus().isUnauthorized(); } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - api.get() - .uri("/secured-route") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo(secret); + api.get().uri("/secured-route").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo(secret); } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { - api.get() - .uri("/secured-route") - .exchange() - .expectStatus() - .isForbidden(); + api.get().uri("/secured-route").exchange().expectStatus().isForbidden(); } /*---------------------------------------------------------------------------------------------------------*/ - /* /secured-method */ - /* This end-point is secured with "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method */ + /* /secured-method */ + /* + * This end-point is secured with + * "@PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')")" on @Controller method + */ /*---------------------------------------------------------------------------------------------------------*/ @Test @WithAnonymousUser void givenRequestIsAnonymous_whenGetSecuredMethod_thenUnauthorized() throws Exception { - api.get() - .uri("/secured-method") - .exchange() - .expectStatus() - .isUnauthorized(); + api.get().uri("/secured-method").exchange().expectStatus().isUnauthorized(); } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(Mono.just(secret)); - api.get() - .uri("/secured-method") - .exchange() - .expectStatus() - .isOk() - .expectBody(String.class) - .isEqualTo(secret); + api.get().uri("/secured-method").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo(secret); } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { - api.get() - .uri("/secured-method") - .exchange() - .expectStatus() - .isForbidden(); + api.get().uri("/secured-method").exchange().expectStatus().isForbidden(); } } diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/ch4mpy.json b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/ch4mpy.json new file mode 100644 index 0000000000..22f7bb2cea --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/ch4mpy.json @@ -0,0 +1,15 @@ +{ + "iss": "https://localhost:8443/realms/master", + "sub": "281c4558-550c-413b-9972-2d2e5bde6b9b", + "iat": 1695992542, + "exp": 1695992642, + "preferred_username": "ch4mpy", + "realm_access": { + "roles": [ + "admin", + "ROLE_AUTHORIZED_PERSONNEL" + ] + }, + "email": "ch4mp@c4-soft.com", + "scope": "openid email" +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/tonton-pirate.json b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/tonton-pirate.json new file mode 100644 index 0000000000..13a422f6fd --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/src/test/resources/tonton-pirate.json @@ -0,0 +1,15 @@ +{ + "iss": "https://localhost:8443/realms/master", + "sub": "2d2e5bde6b9b-550c-413b-9972-281c4558", + "iat": 1695992551, + "exp": 1695992651, + "preferred_username": "tonton-pirate", + "realm_access": { + "roles": [ + "uncle", + "PIRATE" + ] + }, + "email": "tonton-pirate@c4-soft.com", + "scope": "openid email" +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java index a30c60eab0..8258955afe 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/main/java/com/baeldung/ServletResourceServerApplication.java @@ -1,5 +1,7 @@ package com.baeldung; +import static org.springframework.security.config.Customizer.withDefaults; + import java.util.Collection; import java.util.List; import java.util.Map; @@ -23,8 +25,10 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.oidc.StandardClaimNames; import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -43,56 +47,52 @@ public class ServletResourceServerApplication { @EnableWebSecurity static class SecurityConf { @Bean - SecurityFilterChain filterChain(HttpSecurity http, Converter> authoritiesConverter) throws Exception { - http.oauth2ResourceServer() - .jwt() - .jwtAuthenticationConverter(jwt -> new JwtAuthenticationToken(jwt, authoritiesConverter.convert(jwt))); - http.sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .csrf() - .disable(); - http.exceptionHandling() - .authenticationEntryPoint((request, response, authException) -> { - response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\""); - response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase()); - }); + SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(withDefaults())); + http.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); + http.csrf(csrf -> csrf.disable()); + http.exceptionHandling(eh -> eh.authenticationEntryPoint((request, response, authException) -> { + response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Bearer realm=\"Restricted Content\""); + response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase()); + })); - http.authorizeHttpRequests() - .requestMatchers("/secured-route") - .hasRole("AUTHORIZED_PERSONNEL") - .anyRequest() - .authenticated(); + // @formatter:off + http.authorizeHttpRequests(req -> req + .requestMatchers(new AntPathRequestMatcher("/secured-route")).hasRole("AUTHORIZED_PERSONNEL") + .anyRequest().authenticated()); + // @formatter:on return http.build(); } - static interface AuthoritiesConverter extends Converter> { + static interface JwtAuthoritiesConverter extends Converter> { } @Bean - AuthoritiesConverter realmRoles2AuthoritiesConverter() { + JwtAuthoritiesConverter realmRoles2AuthoritiesConverter() { return (Jwt jwt) -> { - final var realmRoles = Optional.of(jwt.getClaimAsMap("realm_access")) - .orElse(Map.of()); + final var realmRoles = Optional.of(jwt.getClaimAsMap("realm_access")).orElse(Map.of()); @SuppressWarnings("unchecked") final var roles = (List) realmRoles.getOrDefault("roles", List.of()); - return roles.stream() - .map(SimpleGrantedAuthority::new) - .map(GrantedAuthority.class::cast) - .toList(); + return roles.stream().map(SimpleGrantedAuthority::new).map(GrantedAuthority.class::cast).toList(); }; } + + @Bean + JwtAuthenticationConverter authenticationConverter(Converter> authoritiesConverter) { + final var authenticationConverter = new JwtAuthenticationConverter(); + authenticationConverter.setPrincipalClaimName(StandardClaimNames.PREFERRED_USERNAME); + authenticationConverter.setJwtGrantedAuthoritiesConverter(authoritiesConverter); + return authenticationConverter; + } } @Service public static class MessageService { public String greet() { - final var who = (JwtAuthenticationToken) SecurityContextHolder.getContext() - .getAuthentication(); - final var claims = who.getTokenAttributes(); - return "Hello %s! You are granted with %s.".formatted(claims.getOrDefault(StandardClaimNames.PREFERRED_USERNAME, claims.get(StandardClaimNames.SUB)), who.getAuthorities()); + final var who = (JwtAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + return "Hello %s! You are granted with %s.".formatted(who.getName(), who.getAuthorities()); } @PreAuthorize("hasRole('AUTHORIZED_PERSONNEL')") diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java index 3c608d226e..ca237fb888 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/MessageServiceUnitTest.java @@ -3,28 +3,49 @@ package com.baeldung; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.stream.Stream; + import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; -import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.oidc.StandardClaimNames; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import com.baeldung.ServletResourceServerApplication.MessageService; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.baeldung.ServletResourceServerApplication.SecurityConf; +import com.c4_soft.springaddons.security.oauth2.test.AuthenticationFactoriesTestConf; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication; -@Import({ MessageService.class }) +@Import({ MessageService.class, SecurityConf.class }) +@ImportAutoConfiguration(AuthenticationFactoriesTestConf.class) @ExtendWith(SpringExtension.class) -@EnableMethodSecurity +@TestInstance(Lifecycle.PER_CLASS) class MessageServiceUnitTest { @Autowired MessageService messageService; + @Autowired + WithJwt.AuthenticationFactory authFactory; + + @MockBean + JwtDecoder jwtDecoder; + /*----------------------------------------------------------------------------*/ /* greet() */ /* Expects a JwtAuthenticationToken to be retrieved from the security-context */ @@ -41,10 +62,12 @@ class MessageServiceUnitTest { assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); } - @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenSecurityContextIsPopulatedWithJwtAuthenticationToken_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities() { - assertEquals("Hello ch4mpy! You are granted with [admin, ROLE_AUTHORIZED_PERSONNEL].", messageService.greet()); + @ParameterizedTest + @MethodSource("allIdentities") + void givenUserIsAuthenticated_whenGreet_thenReturnGreetingWithPreferredUsernameAndAuthorities(@ParameterizedAuthentication Authentication auth) { + final var jwt = (JwtAuthenticationToken) auth; + final var expected = "Hello %s! You are granted with %s.".formatted(jwt.getTokenAttributes().get(StandardClaimNames.PREFERRED_USERNAME), auth.getAuthorities()); + assertEquals(expected, messageService.greet()); } @Test @@ -65,15 +88,22 @@ class MessageServiceUnitTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenReturnSecret() { + @WithJwt("ch4mpy.json") + void givenUserIsCh4mpy_whenGetSecret_thenReturnSecret() { assertEquals("Only authorized personnel can read that", messageService.getSecret()); } @Test - @WithMockJwtAuth(authorities = { "admin" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecret_thenThrowsAccessDeniedException() { + @WithJwt("tonton-pirate.json") + void givenUserIsTontonPirate_whenGetSecret_thenThrowsAccessDeniedException() { assertThrows(AccessDeniedException.class, () -> messageService.getSecret()); } + /*--------------------------------------------*/ + /* methodSource returning all test identities */ + /*--------------------------------------------*/ + private Stream allIdentities() { + final var authentications = authFactory.authenticationsFrom("ch4mpy.json", "tonton-pirate.json").toList(); + return authentications.stream(); + } } diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java index 5bb539741f..4f2fe51787 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/ServletResourceServerApplicationIntegrationTest.java @@ -12,8 +12,8 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.test.web.servlet.MockMvc; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithJwt; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication; @SpringBootTest(webEnvironment = WebEnvironment.MOCK) @AutoConfigureMockMvc @@ -34,7 +34,7 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) + @WithJwt("ch4mpy.json") void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { api.perform(get("/greet")) .andExpect(status().isOk()) @@ -54,7 +54,7 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { api.perform(get("/secured-route")) .andExpect(status().isOk()) @@ -62,7 +62,7 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { api.perform(get("/secured-route")) .andExpect(status().isForbidden()); @@ -81,7 +81,7 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("ROLE_AUTHORIZED_PERSONNEL") + @WithMockAuthentication("ROLE_AUTHORIZED_PERSONNEL") void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { api.perform(get("/secured-method")) .andExpect(status().isOk()) @@ -89,7 +89,7 @@ class ServletResourceServerApplicationIntegrationTest { } @Test - @WithMockJwtAuth("admin") + @WithMockAuthentication("admin") void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { api.perform(get("/secured-method")) .andExpect(status().isForbidden()); diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java index 9162768930..2534d9919a 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/java/com/baeldung/SpringAddonsGreetingControllerUnitTest.java @@ -8,16 +8,19 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.security.core.Authentication; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.test.web.servlet.MockMvc; import com.baeldung.ServletResourceServerApplication.GreetingController; import com.baeldung.ServletResourceServerApplication.MessageService; -import com.c4_soft.springaddons.security.oauth2.test.annotations.OpenIdClaims; -import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockJwtAuth; +import com.c4_soft.springaddons.security.oauth2.test.annotations.WithMockAuthentication; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.AuthenticationSource; +import com.c4_soft.springaddons.security.oauth2.test.annotations.parameterized.ParameterizedAuthentication; @WebMvcTest(controllers = GreetingController.class, properties = { "server.ssl.enabled=false" }) class SpringAddonsGreetingControllerUnitTest { @@ -40,9 +43,11 @@ class SpringAddonsGreetingControllerUnitTest { .andExpect(status().isUnauthorized()); } - @Test - @WithMockJwtAuth(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, claims = @OpenIdClaims(preferredUsername = "ch4mpy")) - void givenUserIsAuthenticated_whenGetGreet_thenOk() throws Exception { + @ParameterizedTest + @AuthenticationSource({ + @WithMockAuthentication(authorities = { "admin", "ROLE_AUTHORIZED_PERSONNEL" }, name = "ch4mpy"), + @WithMockAuthentication(authorities = { "uncle", "PIRATE" }, name = "tonton-pirate") }) + void givenUserIsAuthenticated_whenGetGreet_thenOk(@ParameterizedAuthentication Authentication auth) throws Exception { final var greeting = "Whatever the service returns"; when(messageService.greet()).thenReturn(greeting); @@ -66,7 +71,7 @@ class SpringAddonsGreetingControllerUnitTest { } @Test - @WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) + @WithMockAuthentication({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenOk() throws Exception { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); @@ -77,7 +82,7 @@ class SpringAddonsGreetingControllerUnitTest { } @Test - @WithMockJwtAuth({ "admin" }) + @WithMockAuthentication({ "admin" }) void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredRoute_thenForbidden() throws Exception { api.perform(get("/secured-route")) .andExpect(status().isForbidden()); @@ -96,7 +101,7 @@ class SpringAddonsGreetingControllerUnitTest { } @Test - @WithMockJwtAuth({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) + @WithMockAuthentication({ "admin", "ROLE_AUTHORIZED_PERSONNEL" }) void givenUserIsGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenOk() throws Exception { final var secret = "Secret!"; when(messageService.getSecret()).thenReturn(secret); @@ -107,7 +112,7 @@ class SpringAddonsGreetingControllerUnitTest { } @Test - @WithMockJwtAuth(authorities = { "admin" }) + @WithMockAuthentication({ "admin" }) void givenUserIsNotGrantedWithRoleAuthorizedPersonnel_whenGetSecuredMethod_thenForbidden() throws Exception { api.perform(get("/secured-method")) .andExpect(status().isForbidden()); diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/ch4mpy.json b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/ch4mpy.json new file mode 100644 index 0000000000..22f7bb2cea --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/ch4mpy.json @@ -0,0 +1,15 @@ +{ + "iss": "https://localhost:8443/realms/master", + "sub": "281c4558-550c-413b-9972-2d2e5bde6b9b", + "iat": 1695992542, + "exp": 1695992642, + "preferred_username": "ch4mpy", + "realm_access": { + "roles": [ + "admin", + "ROLE_AUTHORIZED_PERSONNEL" + ] + }, + "email": "ch4mp@c4-soft.com", + "scope": "openid email" +} \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/tonton-pirate.json b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/tonton-pirate.json new file mode 100644 index 0000000000..13a422f6fd --- /dev/null +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/src/test/resources/tonton-pirate.json @@ -0,0 +1,15 @@ +{ + "iss": "https://localhost:8443/realms/master", + "sub": "2d2e5bde6b9b-550c-413b-9972-281c4558", + "iat": 1695992551, + "exp": 1695992651, + "preferred_username": "tonton-pirate", + "realm_access": { + "roles": [ + "uncle", + "PIRATE" + ] + }, + "email": "tonton-pirate@c4-soft.com", + "scope": "openid email" +} \ No newline at end of file From e203f430e2957b73d3ba10c7991d7e41a8a1c25c Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 20 Oct 2023 17:19:07 +0530 Subject: [PATCH 171/831] JJAVA-25376: adding missed spring-thymeleaf-attributes in the spring-web-module (#14849) --- spring-web-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index d513822ea3..9f03b83392 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -52,6 +52,7 @@ spring-thymeleaf-4 spring-thymeleaf-5 spring-web-url + spring-thymeleaf-attributes \ No newline at end of file From ca2edea0d4f3ec7cac2e5b9a1b5b8923df48939d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 20:57:31 +0800 Subject: [PATCH 172/831] Update README.md [skip ci] --- core-java-modules/core-java-os/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-os/README.md b/core-java-modules/core-java-os/README.md index 81e67e4663..6d477de70a 100644 --- a/core-java-modules/core-java-os/README.md +++ b/core-java-modules/core-java-os/README.md @@ -14,6 +14,5 @@ This module contains articles about working with the operating system (OS) in Ja - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [Taking Screenshots Using Java](https://www.baeldung.com/java-taking-screenshots) - [Java Sound API – Capturing Microphone](https://www.baeldung.com/java-sound-api-capture-mic) -- [How to Detect the Username Using Java](https://www.baeldung.com/java-get-username) This module uses Java 9, so make sure to have the JDK 9 installed to run it. From adfb51acac6b7268788b1902c5dbd8780afe4978 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 20:57:48 +0800 Subject: [PATCH 173/831] Update README.md [skip ci] --- core-java-modules/core-java-os-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-os-2/README.md b/core-java-modules/core-java-os-2/README.md index fa9f504184..c2f48f2854 100644 --- a/core-java-modules/core-java-os-2/README.md +++ b/core-java-modules/core-java-os-2/README.md @@ -3,5 +3,5 @@ This module contains articles about working with the operating system (OS) in Java ### Relevant Articles: - +- [How to Detect the Username Using Java](https://www.baeldung.com/java-get-username) From 0945fde3dd304c82ada8082c056675d5dc4e77fb Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Fri, 20 Oct 2023 15:59:37 +0300 Subject: [PATCH 174/831] [JAVA-25997] Fixed typo --- spring-vault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index e8257125bc..b3690c7b7f 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -75,7 +75,7 @@ org.springframework.cloud spring-cloud-starter-vault-config - ${spring-cloud-starter-vault-config.version}3.1.3 + ${spring-cloud-starter-vault-config.version} From a89385b14ffdb3bd5db85a5cba41014cea06e033 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:12:35 +0800 Subject: [PATCH 175/831] Update README.md [skip ci] --- core-java-modules/core-java-io-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-5/README.md b/core-java-modules/core-java-io-5/README.md index 9fb4b967a4..3cc514e087 100644 --- a/core-java-modules/core-java-io-5/README.md +++ b/core-java-modules/core-java-io-5/README.md @@ -4,5 +4,6 @@ This module contains articles about core Java input and output (IO) ### Relevant Articles: - [Get File Extension From MIME Type in Java](https://www.baeldung.com/java-mime-type-file-extension) +- [How to Remove Line Breaks From a File in Java](https://www.baeldung.com/java-file-remove-line-breaks) - [[<-- Prev]](/core-java-modules/core-java-io-4) From d30947099d23ae3553d8eabd8021ceee7d8b581a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:15:42 +0800 Subject: [PATCH 176/831] Update README.md [skip ci] --- algorithms-modules/algorithms-miscellaneous-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/algorithms-modules/algorithms-miscellaneous-7/README.md b/algorithms-modules/algorithms-miscellaneous-7/README.md index 82d9df9292..87a1ee15ec 100644 --- a/algorithms-modules/algorithms-miscellaneous-7/README.md +++ b/algorithms-modules/algorithms-miscellaneous-7/README.md @@ -4,4 +4,5 @@ - [Find the N Most Frequent Elements in a Java Array](https://www.baeldung.com/java-n-most-frequent-elements-array) - [Getting Pixel Array From Image in Java](https://www.baeldung.com/java-getting-pixel-array-from-image) - [Calculate Distance Between Two Coordinates in Java](https://www.baeldung.com/java-find-distance-between-points) +- [Rotate Arrays in Java](https://www.baeldung.com/java-rotate-arrays) - More articles: [[<-- prev]](/algorithms-miscellaneous-6) From c309272de3a1d78ad9741e9b81eb6d5f489db1e2 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:20:38 +0800 Subject: [PATCH 177/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index 27a07a5f8b..a43f562a0a 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -2,3 +2,4 @@ - [Convert a Number to a Letter in Java](https://www.baeldung.com/java-convert-number-to-letter) - [Convert Long to BigDecimal in Java](https://www.baeldung.com/java-convert-long-bigdecimal) - [Convert int to Long in Java](https://www.baeldung.com/java-convert-int-long) +- [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) From 2609ac2689681e0e08f85a57a2370738de60f26f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:24:28 +0800 Subject: [PATCH 178/831] Update README.md [skip ci] --- core-java-modules/core-java-18/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java-18/README.md b/core-java-modules/core-java-18/README.md index e69de29bb2..63772e96b3 100644 --- a/core-java-modules/core-java-18/README.md +++ b/core-java-modules/core-java-18/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Deprecate Finalization in Java 18](https://www.baeldung.com/java-18-deprecate-finalization) From 2e219b6a08048b7eb16c32763b52952b347ad0a1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:28:07 +0800 Subject: [PATCH 179/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-6/README.md b/core-java-modules/core-java-numbers-6/README.md index e3d5454d60..cf84e29710 100644 --- a/core-java-modules/core-java-numbers-6/README.md +++ b/core-java-modules/core-java-numbers-6/README.md @@ -6,4 +6,5 @@ - [How to Split an Integer Number Into Digits in Java](https://www.baeldung.com/java-integer-individual-digits) - [Java Double vs. BigDecimal](https://www.baeldung.com/java-double-vs-bigdecimal) - [Finding the Square Root of a BigInteger in Java](https://www.baeldung.com/java-find-square-root-biginteger) +- [Truncate a Double to Two Decimal Places in Java](https://www.baeldung.com/java-double-round-two-decimal-places) - More articles: [[<-- prev]](../core-java-numbers-5) From 838e1d14ca3d1208b53654aa6cad21dd46130109 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:31:32 +0800 Subject: [PATCH 180/831] Update README.md [skip ci] --- core-java-modules/core-java-reflection-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-reflection-3/README.md b/core-java-modules/core-java-reflection-3/README.md index d997aa22f1..023fb979e4 100644 --- a/core-java-modules/core-java-reflection-3/README.md +++ b/core-java-modules/core-java-reflection-3/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Is Java Reflection Bad Practice?](https://www.baeldung.com/java-reflection-bad-practice) +- [Is Java Reflection Bad Practice?](https://www.baeldung.com/java-reflection-benefits-drawbacks) From 29eb8388c94b5f21ef64a0a3b318091d90836e78 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:33:29 +0800 Subject: [PATCH 181/831] Update README.md [skip ci] --- core-java-modules/core-java-17/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-17/README.md b/core-java-modules/core-java-17/README.md index 2d4a2e0382..4b1125532d 100644 --- a/core-java-modules/core-java-17/README.md +++ b/core-java-modules/core-java-17/README.md @@ -8,3 +8,4 @@ - [Sealed Classes and Interfaces in Java](https://www.baeldung.com/java-sealed-classes-interfaces) - [Migrate From Java 8 to Java 17](https://www.baeldung.com/java-migrate-8-to-17) - [Format Multiple ‘or’ Conditions in an If Statement in Java](https://www.baeldung.com/java-multiple-or-conditions-if-statement) +- [Get All Record Fields and Its Values via Reflection](https://www.baeldung.com/java-reflection-record-fields-values) From bd31b728581c0cbf7774193cbbd2f9443b85bb2e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:35:24 +0800 Subject: [PATCH 182/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md index d4f432bdcb..f116d0315e 100644 --- a/core-java-modules/core-java-collections-maps-6/README.md +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -9,3 +9,4 @@ - [Converting String or String Array to Map in Java](https://www.baeldung.com/java-convert-string-to-map) - [Remove Duplicate Values From HashMap in Java](https://www.baeldung.com/java-hashmap-delete-duplicates) - [Sorting Java Map in Descending Order](https://www.baeldung.com/java-sort-map-descending) +- [Convert HashMap.toString() to HashMap in Java](https://www.baeldung.com/hashmap-from-tostring) From 004a70eff3ec77c510c60a884eb0ab746e5efff9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:40:59 +0800 Subject: [PATCH 183/831] Update README.md [skip ci] --- libraries-apache-commons-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md index 76105d6ea4..180c84b31c 100644 --- a/libraries-apache-commons-2/README.md +++ b/libraries-apache-commons-2/README.md @@ -4,4 +4,5 @@ This module contains articles about Apache Commons libraries. ### Relevant articles - [Extracting a Tar File in Java](https://www.baeldung.com/java-extract-tar-file) +- [Convert a String with Unicode Encoding to a String of Letters](https://www.baeldung.com/java-convert-string-unicode-encoding) - More articles: [[<--prev]](../libraries-apache-commons) From b3702a402a613b7902ae375e6db8306cfe44ae19 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:44:03 +0800 Subject: [PATCH 184/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index a43f562a0a..dead88f025 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -3,3 +3,4 @@ - [Convert Long to BigDecimal in Java](https://www.baeldung.com/java-convert-long-bigdecimal) - [Convert int to Long in Java](https://www.baeldung.com/java-convert-int-long) - [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) +- [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal) From 8457a250f44d3e537adfd85bc5c7c73dab22503c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:46:32 +0800 Subject: [PATCH 185/831] Update README.md [skip ci] --- core-java-modules/core-java-lang-oop-others/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-oop-others/README.md b/core-java-modules/core-java-lang-oop-others/README.md index 4adfec86ef..ffd1d47f79 100644 --- a/core-java-modules/core-java-lang-oop-others/README.md +++ b/core-java-modules/core-java-lang-oop-others/README.md @@ -9,3 +9,4 @@ This module contains articles about Object Oriented Programming (OOP) in Java - [Check If All the Variables of an Object Are Null](https://www.baeldung.com/java-check-all-variables-object-null) - [Law of Demeter in Java](https://www.baeldung.com/java-demeter-law) - [Java Interface Naming Conventions](https://www.baeldung.com/java-interface-naming-conventions) +- [Difference Between Information Hiding and Encapsulation](https://www.baeldung.com/java-information-hiding-vs-encapsulation) From 76fc84ba64cfef623b8114e5431257efe9f963fd Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:49:19 +0800 Subject: [PATCH 186/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-conversions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-conversions-3/README.md b/core-java-modules/core-java-collections-conversions-3/README.md index 653f518840..959e4e8160 100644 --- a/core-java-modules/core-java-collections-conversions-3/README.md +++ b/core-java-modules/core-java-collections-conversions-3/README.md @@ -4,3 +4,4 @@ This module contains articles about conversions among Collection types in Java. ### Relevant Articles: - [Converting HashMap Values to an ArrayList in Java](https://www.baeldung.com/java-hashmap-arraylist) +- [Joining a List in Java With Commas and “and”](https://www.baeldung.com/java-string-concatenation-natural-language) From f0d148fc48b0da8a212ddb1d2f797d16f1d20a08 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 21:52:53 +0800 Subject: [PATCH 187/831] Update README.md [skip ci] --- jersey/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jersey/README.md b/jersey/README.md index 4c8c235be5..aa5a6a3b28 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -11,3 +11,4 @@ This module contains articles about Jersey. - [Explore Jersey Request Parameters](https://www.baeldung.com/jersey-request-parameters) - [Add a Header to a Jersey SSE Client Request](https://www.baeldung.com/jersey-sse-client-request-headers) - [Exception Handling With Jersey](https://www.baeldung.com/java-exception-handling-jersey) +- [@FormDataParam vs. @FormParam in Jersey](https://www.baeldung.com/jersey-formdataparam-vs-formparam) From 349fee920247c9ca95117483b92e2b950e7ff5ac Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:00:01 +0800 Subject: [PATCH 188/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index c63f3b360b..2724df5695 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -1 +1,2 @@ -## Relevant Articles \ No newline at end of file +## Relevant Articles +- [Difference Between putIfAbsent() and computeIfAbsent() in Java’s Map](https://www.baeldung.com/java-map-putifabsent-computeifabsent) From 1bc9fe21c65c9cfb79fb7cb24bb78d3868b77507 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:04:09 +0800 Subject: [PATCH 189/831] Update README.md [skip ci] --- spring-5-webflux-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-webflux-2/README.md b/spring-5-webflux-2/README.md index e64c88c61d..1b01f519a4 100644 --- a/spring-5-webflux-2/README.md +++ b/spring-5-webflux-2/README.md @@ -6,3 +6,4 @@ This module contains articles about Spring 5 WebFlux - [Spring Webflux and @Cacheable Annotation](https://www.baeldung.com/spring-webflux-cacheable) - [Comparison Between Mono’s doOnNext() and doOnSuccess()](https://www.baeldung.com/mono-doonnext-doonsuccess) - [How to Access the First Element of a Flux](https://www.baeldung.com/java-flux-first-element) +- [Using zipWhen() with Mono](https://www.baeldung.com/java-mono-zipwhen) From 60bdc1f50530437dcb2c0b19f5ba8a8a7c6e1160 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:06:57 +0800 Subject: [PATCH 190/831] Update README.md [skip ci] --- core-java-modules/core-java-lang-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md index 9ddd08d9ba..91c0e5212c 100644 --- a/core-java-modules/core-java-lang-6/README.md +++ b/core-java-modules/core-java-lang-6/README.md @@ -8,3 +8,4 @@ This module contains articles about core features in the Java language - [What Is the Maximum Depth of the Java Call Stack?](https://www.baeldung.com/java-call-stack-max-depth) - [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample) - [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code) +- [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects) From 6fd419707fb9c6dac296c30ea2dd8a19837ae760 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:08:56 +0800 Subject: [PATCH 191/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-3-testcontainers/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-3-testcontainers/README.md b/spring-boot-modules/spring-boot-3-testcontainers/README.md index 183c64faae..e6aa952295 100644 --- a/spring-boot-modules/spring-boot-3-testcontainers/README.md +++ b/spring-boot-modules/spring-boot-3-testcontainers/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Built-in Testcontainers Support in Spring Boot](https://www.baeldung.com/spring-boot-built-in-testcontainers) +- [How to Reuse Testcontainers in Java](https://www.baeldung.com/java-reuse-testcontainers) From de67a0416a95fc76f7b447474640be384488e0be Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:10:18 +0800 Subject: [PATCH 192/831] Update README.md [skip ci] --- patterns-modules/design-patterns-creational-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns-modules/design-patterns-creational-2/README.md b/patterns-modules/design-patterns-creational-2/README.md index dc5b2a1861..b7fdb556d1 100644 --- a/patterns-modules/design-patterns-creational-2/README.md +++ b/patterns-modules/design-patterns-creational-2/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [The Factory Design Pattern in Java](https://www.baeldung.com/java-factory-pattern) +- [Drawbacks of the Singleton Design Pattern](https://www.baeldung.com/java-patterns-singleton-cons) From faae5f776be4f994f3c7fe61f924c94ad4db2851 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:12:59 +0800 Subject: [PATCH 193/831] Update README.md [skip ci] --- core-java-modules/core-java-string-conversions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-conversions-3/README.md b/core-java-modules/core-java-string-conversions-3/README.md index 4b348dd555..4ec4771eea 100644 --- a/core-java-modules/core-java-string-conversions-3/README.md +++ b/core-java-modules/core-java-string-conversions-3/README.md @@ -2,3 +2,4 @@ - [Object.toString() vs String.valueOf()](https://www.baeldung.com/java-object-tostring-vs-string-valueof) - [Convert String to Int Using Encapsulation](https://www.baeldung.com/java-encapsulation-convert-string-to-int) - [HashMap with Multiple Values for the Same Key](https://www.baeldung.com/java-hashmap-multiple-values-per-key) +- [Split Java String Into Key-Value Pairs](https://www.baeldung.com/java-split-string-map) From 41ed71587d46a30fba592d2ddd2b91ffcc047903 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 20 Oct 2023 19:45:03 +0530 Subject: [PATCH 194/831] JAVA-25998 Fix parent.relativePath warning (#15032) --- spring-boot-modules/spring-boot-aws/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-aws/pom.xml b/spring-boot-modules/spring-boot-aws/pom.xml index 460acae247..44cd38be3f 100644 --- a/spring-boot-modules/spring-boot-aws/pom.xml +++ b/spring-boot-modules/spring-boot-aws/pom.xml @@ -14,6 +14,7 @@ org.springframework.boot spring-boot-starter-parent 2.7.11 + From 20c2fc3bb5d2300bd4cc1bb7cf4e6adc62848122 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:23:11 +0300 Subject: [PATCH 195/831] JAVA-24463 Coalesce spring-reactive-data and spring-reactive-data-2 into a single module (#15026) Co-authored-by: timis1 --- spring-reactive-modules/pom.xml | 1 - .../spring-reactive-data-2/README.md | 10 --- .../spring-reactive-data-2/pom.xml | 69 ------------------ .../src/main/resources/application.properties | 0 .../spring-reactive-data/README.md | 4 +- .../spring-reactive-data/pom.xml | 71 +++++++++---------- .../pagination/PaginationApplication.java | 0 .../CustomWebMvcConfigurationSupport.java | 0 .../pagination/config/DatabaseConfig.java | 0 .../ProductPaginationController.java | 0 .../baeldung/pagination/model/Product.java | 0 .../repository/ProductRepository.java | 0 .../src/main/resources/init.sql | 0 ...ctPaginationControllerIntegrationTest.java | 0 .../{ => r2dbc}/SpringContextTest.java | 4 +- 15 files changed, 39 insertions(+), 120 deletions(-) delete mode 100644 spring-reactive-modules/spring-reactive-data-2/README.md delete mode 100644 spring-reactive-modules/spring-reactive-data-2/pom.xml delete mode 100644 spring-reactive-modules/spring-reactive-data-2/src/main/resources/application.properties rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/PaginationApplication.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/config/CustomWebMvcConfigurationSupport.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/config/DatabaseConfig.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/controller/ProductPaginationController.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/model/Product.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/java/com/baeldung/pagination/repository/ProductRepository.java (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/main/resources/init.sql (100%) rename spring-reactive-modules/{spring-reactive-data-2 => spring-reactive-data}/src/test/java/com/baeldung/pagination/controller/ProductPaginationControllerIntegrationTest.java (100%) rename spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/{ => r2dbc}/SpringContextTest.java (85%) diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index dd827d796e..61a3c3d17d 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -18,7 +18,6 @@ spring-reactive-data - spring-reactive-data-2 spring-reactive-2 spring-reactive-3 spring-reactive-client diff --git a/spring-reactive-modules/spring-reactive-data-2/README.md b/spring-reactive-modules/spring-reactive-data-2/README.md deleted file mode 100644 index c13171cbc6..0000000000 --- a/spring-reactive-modules/spring-reactive-data-2/README.md +++ /dev/null @@ -1,10 +0,0 @@ -## Spring Data Reactive Project - -This module contains articles about reactive Spring Boot Data - -### The Course - -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles -- [Pagination in Spring Webflux and Spring Data Reactive](https://www.baeldung.com/spring-data-webflux-pagination) diff --git a/spring-reactive-modules/spring-reactive-data-2/pom.xml b/spring-reactive-modules/spring-reactive-data-2/pom.xml deleted file mode 100644 index 64ce278973..0000000000 --- a/spring-reactive-modules/spring-reactive-data-2/pom.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - 4.0.0 - spring-reactive-data-2 - spring-reactive-data-2 - jar - - - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT - - - - UTF-8 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-data-r2dbc - - - org.springframework - spring-webflux - - - org.springframework.boot - spring-boot-starter-test - test - - - com.h2database - h2 - runtime - - - io.r2dbc - r2dbc-h2 - runtime - - - org.projectlombok - lombok - true - - - io.projectreactor - reactor-test - test - - - javax.validation - validation-api - 2.0.1.Final - - - - \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/resources/application.properties b/spring-reactive-modules/spring-reactive-data-2/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-reactive-modules/spring-reactive-data/README.md b/spring-reactive-modules/spring-reactive-data/README.md index cafd0c502f..259ab0be62 100644 --- a/spring-reactive-modules/spring-reactive-data/README.md +++ b/spring-reactive-modules/spring-reactive-data/README.md @@ -3,7 +3,9 @@ This module contains articles about reactive Spring Boot Data ### The Course + The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) \ No newline at end of file +- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) +- [Pagination in Spring Webflux and Spring Data Reactive](https://www.baeldung.com/spring-data-webflux-pagination) diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index 91c4dca6e8..03ea440b4f 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -1,10 +1,10 @@ - 4.0.0 spring-reactive-data - spring-reactive-data + spring-reactive-data-2 jar @@ -13,17 +13,9 @@ 1.0.0-SNAPSHOT - - - - org.apache.logging.log4j - log4j-bom - ${log4j2.version} - import - pom - - - + + UTF-8 + @@ -31,13 +23,16 @@ spring-boot-starter-web - org.projectlombok - lombok + org.springframework.boot + spring-boot-starter-webflux - io.projectreactor - reactor-test - test + org.springframework.boot + spring-boot-starter-data-r2dbc + + + org.springframework + spring-webflux org.springframework.boot @@ -45,12 +40,29 @@ test - org.springframework.boot - spring-boot-starter-webflux + com.h2database + h2 + runtime - org.springframework.data - spring-data-r2dbc + io.r2dbc + r2dbc-h2 + runtime + + + org.projectlombok + lombok + true + + + io.projectreactor + reactor-test + test + + + javax.validation + validation-api + 2.0.1.Final io.r2dbc @@ -58,17 +70,4 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 2.17.1 - - \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/PaginationApplication.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/PaginationApplication.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/PaginationApplication.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/PaginationApplication.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/config/CustomWebMvcConfigurationSupport.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/config/CustomWebMvcConfigurationSupport.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/config/CustomWebMvcConfigurationSupport.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/config/CustomWebMvcConfigurationSupport.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/config/DatabaseConfig.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/config/DatabaseConfig.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/config/DatabaseConfig.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/config/DatabaseConfig.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/controller/ProductPaginationController.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/controller/ProductPaginationController.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/controller/ProductPaginationController.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/controller/ProductPaginationController.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/model/Product.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/model/Product.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/model/Product.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/model/Product.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/repository/ProductRepository.java b/spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/repository/ProductRepository.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/java/com/baeldung/pagination/repository/ProductRepository.java rename to spring-reactive-modules/spring-reactive-data/src/main/java/com/baeldung/pagination/repository/ProductRepository.java diff --git a/spring-reactive-modules/spring-reactive-data-2/src/main/resources/init.sql b/spring-reactive-modules/spring-reactive-data/src/main/resources/init.sql similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/main/resources/init.sql rename to spring-reactive-modules/spring-reactive-data/src/main/resources/init.sql diff --git a/spring-reactive-modules/spring-reactive-data-2/src/test/java/com/baeldung/pagination/controller/ProductPaginationControllerIntegrationTest.java b/spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/pagination/controller/ProductPaginationControllerIntegrationTest.java similarity index 100% rename from spring-reactive-modules/spring-reactive-data-2/src/test/java/com/baeldung/pagination/controller/ProductPaginationControllerIntegrationTest.java rename to spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/pagination/controller/ProductPaginationControllerIntegrationTest.java diff --git a/spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/SpringContextTest.java b/spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/r2dbc/SpringContextTest.java similarity index 85% rename from spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/SpringContextTest.java rename to spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/r2dbc/SpringContextTest.java index dc7bcd1e37..facefd3144 100644 --- a/spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-reactive-modules/spring-reactive-data/src/test/java/com/baeldung/r2dbc/SpringContextTest.java @@ -1,12 +1,10 @@ -package com.baeldung; +package com.baeldung.r2dbc; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.r2dbc.R2dbcApplication; - @RunWith(SpringRunner.class) @SpringBootTest(classes = R2dbcApplication.class) public class SpringContextTest { From a16aa0ee61b10cfce6f78ff0146bbedbabd43a90 Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Fri, 20 Oct 2023 15:17:36 -0700 Subject: [PATCH 196/831] BAEL-5755: remove comments --- .../main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java index d2acafc881..99e5c7c0cb 100644 --- a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java +++ b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java @@ -51,7 +51,6 @@ public class Xml2CsvExample { try (InputStream in = Files.newInputStream(Paths.get(xmlFilePath)); BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath))) { - // Write header to CSV writer.write("bookstore_id,book_id,category,title,author_id,author_name,price\n"); XMLStreamReader reader = inputFactory.createXMLStreamReader(in); @@ -67,7 +66,7 @@ public class Xml2CsvExample { case XMLStreamConstants.START_ELEMENT: currentElement = reader.getLocalName(); if ("Bookstore".equals(currentElement)) { - bookstoreInfo.setLength(0); // clear previous bookstore info + bookstoreInfo.setLength(0); bookstoreInfo.append(reader.getAttributeValue(null, "id")) .append(","); } @@ -94,12 +93,10 @@ public class Xml2CsvExample { case XMLStreamConstants.END_ELEMENT: if ("Book".equals(reader.getLocalName())) { - // remove the last comma and add a newline csvRow.setLength(csvRow.length() - 1); csvRow.append("\n"); writer.write(csvRow.toString()); - // Reset the StringBuilder for the next row csvRow.setLength(0); } break; From ccd0238ff6587d5f3a85a6aba00f365aeba5570b Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 21 Oct 2023 10:58:15 +0530 Subject: [PATCH 197/831] Update pom.xml --- spring-boot-modules/spring-boot-3-2/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index 62369f6670..9e73d8ea32 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -252,7 +252,6 @@ - 1.5.2.Final 2.0.0 3.0.0-M7 @@ -260,4 +259,4 @@ 0.2.0 - \ No newline at end of file + From 106067388dd18e6ae03fbda03798c83ecab9cd13 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 21 Oct 2023 10:36:49 +0200 Subject: [PATCH 198/831] JAVA-220644 | Upgrade spring-boot-persistence-h2 to Spring Boot 3 (#14998) --- .../spring-boot-persistence-h2/pom.xml | 13 ++++++++++--- .../com/baeldung/h2/exceptions/models/User.java | 4 ++-- .../h2db/demo/client/ClientSpringBootApp.java | 4 ++-- .../baeldung/h2db/demo/server/SpringBootApp.java | 2 +- .../h2db/lazy_load_no_trans/entity/Document.java | 6 ++++-- .../h2db/lazy_load_no_trans/entity/User.java | 8 ++++---- .../java/com/baeldung/h2db/notnull/models/Item.java | 9 +++++---- .../baeldung/h2db/springboot/models/Country.java | 8 ++++---- .../src/main/resources/data-trans.sql | 12 ++++++------ .../baeldung/h2db/notnull/ItemIntegrationTest.java | 11 ++++++----- 10 files changed, 44 insertions(+), 33 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-h2/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml index f643db2260..3c4bf888b3 100644 --- a/persistence-modules/spring-boot-persistence-h2/pom.xml +++ b/persistence-modules/spring-boot-persistence-h2/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -44,12 +44,19 @@ db-util ${db-util.version} + + + + org.hibernate.orm + hibernate-core + 6.3.1.Final + com.baeldung.h2db.demo.server.SpringBootApp - 1.0.4 + 1.0.7 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java index e54e725fd0..e1ae3c7cf0 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2/exceptions/models/User.java @@ -1,7 +1,7 @@ package com.baeldung.h2.exceptions.models; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; @Entity public class User { diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java index 7402312e1c..3416cba154 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/client/ClientSpringBootApp.java @@ -3,15 +3,15 @@ package com.baeldung.h2db.demo.client; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; -import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import jakarta.annotation.PostConstruct; + @SpringBootApplication @ComponentScan("com.baeldung.h2db.demo.client") public class ClientSpringBootApp { diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java index e75b42a934..2a1eb66b22 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/demo/server/SpringBootApp.java @@ -3,7 +3,7 @@ package com.baeldung.h2db.demo.server; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.h2.tools.Server; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/Document.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/Document.java index 9d69e7eb58..e737722ad4 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/Document.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/Document.java @@ -1,13 +1,14 @@ package com.baeldung.h2db.lazy_load_no_trans.entity; +import jakarta.persistence.Column; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.hibernate.annotations.Immutable; -import javax.persistence.Entity; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; @Entity @Getter @@ -22,5 +23,6 @@ public class Document { private String title; + @Column(name="user_id") private Long userId; } diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/User.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/User.java index ae9cb9e4e8..b46903e589 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/User.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/lazy_load_no_trans/entity/User.java @@ -8,10 +8,10 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.Immutable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; import java.util.ArrayList; import java.util.List; diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/notnull/models/Item.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/notnull/models/Item.java index d2c4015b86..d36c763f0f 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/notnull/models/Item.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/notnull/models/Item.java @@ -1,9 +1,10 @@ package com.baeldung.h2db.notnull.models; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.validation.constraints.NotNull; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; + import java.math.BigDecimal; @Entity diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/Country.java b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/Country.java index d6edab9421..c8bec1e908 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/Country.java +++ b/persistence-modules/spring-boot-persistence-h2/src/main/java/com/baeldung/h2db/springboot/models/Country.java @@ -1,9 +1,9 @@ package com.baeldung.h2db.springboot.models; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.util.Objects; @Table(name = "countries") diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql b/persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql index 2b4aa92542..7031d3ac02 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/data-trans.sql @@ -4,9 +4,9 @@ insert into "user" values (103, 'user3', 'comment3'); insert into "user" values (104, 'user4', 'comment4'); insert into "user" values (105, 'user5', 'comment5'); -insert into "document" values (1, 'doc1', 101); -insert into "document" values (2, 'doc2', 101); -insert into "document" values (3, 'doc3', 101); -insert into "document" values (4, 'doc4', 101); -insert into "document" values (5, 'doc5', 102); -insert into "document" values (6, 'doc6', 102); \ No newline at end of file +insert into "document" ("id","title","user_id") values (1, 'doc1', 101); +insert into "document" ("id","title","user_id") values (2, 'doc2', 101); +insert into "document" ("id","title","user_id") values (3, 'doc3', 101); +insert into "document" ("id","title","user_id") values (4, 'doc4', 101); +insert into "document" ("id","title","user_id") values (5, 'doc5', 102); +insert into "document" ("id","title","user_id") values (6, 'doc6', 102); \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2db/notnull/ItemIntegrationTest.java b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2db/notnull/ItemIntegrationTest.java index 0e2e5e3319..1213df4780 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2db/notnull/ItemIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-h2/src/test/java/com/baeldung/h2db/notnull/ItemIntegrationTest.java @@ -2,16 +2,17 @@ package com.baeldung.h2db.notnull; import com.baeldung.h2db.notnull.daos.ItemRepository; import com.baeldung.h2db.notnull.models.Item; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import javax.validation.ConstraintViolationException; - import static org.assertj.core.api.Assertions.assertThatThrownBy; +import jakarta.validation.ConstraintViolationException; + @RunWith(SpringRunner.class) @SpringBootTest(classes = NotNullVsNullableApplication.class) public class ItemIntegrationTest { @@ -21,8 +22,8 @@ public class ItemIntegrationTest { @Test public void shouldNotAllowToPersistNullItemsPrice() { - assertThatThrownBy(() -> itemRepository.save(new Item())) - .hasRootCauseInstanceOf(ConstraintViolationException.class) - .hasStackTraceContaining("must not be null"); + assertThatThrownBy(() -> itemRepository.save(new Item())).hasRootCauseInstanceOf(ConstraintViolationException.class) + .hasStackTraceContaining("propertyPath=price") + .hasStackTraceContaining("null"); } } From adb490c8743d75ef2da0688ef344533bf8a86a2e Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 21 Oct 2023 10:46:20 +0200 Subject: [PATCH 199/831] JAVA-26048 | upgraded spring-mvc-5 to spring-boot-3 (#15005) --- .../spring-mvc-basics-5/pom.xml | 21 +++++++++++++++---- .../jsonargs/JsonArgumentResolver.java | 2 +- .../com/baeldung/modelattribute/Employee.java | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/spring-web-modules/spring-mvc-basics-5/pom.xml b/spring-web-modules/spring-mvc-basics-5/pom.xml index c957d669bd..e0d603e303 100644 --- a/spring-web-modules/spring-mvc-basics-5/pom.xml +++ b/spring-web-modules/spring-mvc-basics-5/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -30,8 +30,14 @@ tomcat-embed-jasper - javax.servlet - jstl + jakarta.servlet.jsp.jstl + jakarta.servlet.jsp.jstl-api + ${jakarta.servlet.jsp.jstl} + + + org.glassfish.web + jakarta.servlet.jsp.jstl + ${jakarta.servlet.jsp.jstl} org.springframework.boot @@ -53,6 +59,11 @@ jaxb-runtime ${jaxb-runtime.version} + + io.rest-assured + rest-assured + ${io.rest-assured.version} + @@ -73,6 +84,8 @@ 1.3.2 2.7.0 2.3.5 + 2.0.0 + 3.0.0 \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/jsonargs/JsonArgumentResolver.java b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/jsonargs/JsonArgumentResolver.java index 3cb01dae32..94b8d12107 100644 --- a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/jsonargs/JsonArgumentResolver.java +++ b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/jsonargs/JsonArgumentResolver.java @@ -3,7 +3,7 @@ package com.baeldung.jsonargs; import java.io.IOException; import java.util.Objects; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.io.IOUtils; import org.springframework.core.MethodParameter; diff --git a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/modelattribute/Employee.java b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/modelattribute/Employee.java index 0ec3c5c374..2dacfe87d9 100644 --- a/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/modelattribute/Employee.java +++ b/spring-web-modules/spring-mvc-basics-5/src/main/java/com/baeldung/modelattribute/Employee.java @@ -1,6 +1,6 @@ package com.baeldung.modelattribute; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Employee { From b0ed62e8c8d6c18576c1c8b2fd1acd1c1a176299 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 21 Oct 2023 14:27:49 +0530 Subject: [PATCH 200/831] JAVA-24938 Article Code Matches first commit (#14820) --- .../exceptions/throwvsthrows/Main.java | 11 +++++++++-- .../throwvsthrows/NullOrEmptyException.java | 8 ++++++++ .../BuilderWithDefaultValueUnitTest.java | 2 +- .../demo/controller/SwaggerController.java | 2 +- .../beancreationexception/cause9/Config.java | 19 +++++++++++++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/NullOrEmptyException.java create mode 100644 spring-exceptions/src/main/java/com/baeldung/ex/beancreationexception/cause9/Config.java diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java index dfe8fcbd5a..b693bb1219 100644 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java @@ -20,8 +20,9 @@ public class Main { System.out.println("General exception"); } - checkedException(); + checkedExceptionWithTryCatch(); checkedExceptionWithThrows(); + divideByZero(); } private static void checkedExceptionWithThrows() throws FileNotFoundException { @@ -29,7 +30,7 @@ public class Main { FileInputStream stream = new FileInputStream(file); } - private static void checkedException() { + private static void checkedExceptionWithTryCatch() { File file = new File("not_existing_file.txt"); try { FileInputStream stream = new FileInputStream(file); @@ -37,5 +38,11 @@ public class Main { e.printStackTrace(); } } + + private static void divideByZero() { + int numerator = 1; + int denominator = 0; + int result = numerator / denominator; + } } diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/NullOrEmptyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/NullOrEmptyException.java new file mode 100644 index 0000000000..419fb438f2 --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/NullOrEmptyException.java @@ -0,0 +1,8 @@ +package com.baeldung.exceptions.throwvsthrows; + +public class NullOrEmptyException extends RuntimeException { + + public NullOrEmptyException(String errorMessage) { + super(errorMessage); + } +} diff --git a/lombok-modules/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java b/lombok-modules/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java index d9184f605c..a03b262828 100644 --- a/lombok-modules/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java +++ b/lombok-modules/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java @@ -14,7 +14,7 @@ public class BuilderWithDefaultValueUnitTest { } @Test - public void givenBuilderWithDefaultValue_NoArgsWorksAlso() { + public void givenBuilderWithDefaultValue_ThanNoArgsWorksAlso() { Pojo build = new Pojo().toBuilder() .build(); Pojo pojo = new Pojo(); diff --git a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java index 79c35e025e..bffe0659a6 100644 --- a/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java +++ b/spring-boot-modules/spring-boot-swagger-springfox/src/main/java/com/baeldung/springdoc/demo/controller/SwaggerController.java @@ -8,6 +8,6 @@ public class SwaggerController { @RequestMapping("/myproject") public String getRedirectUrl() { - return "redirect:swagger-ui.html"; + return "redirect:swagger-ui/"; } } \ No newline at end of file diff --git a/spring-exceptions/src/main/java/com/baeldung/ex/beancreationexception/cause9/Config.java b/spring-exceptions/src/main/java/com/baeldung/ex/beancreationexception/cause9/Config.java new file mode 100644 index 0000000000..ef182c04b6 --- /dev/null +++ b/spring-exceptions/src/main/java/com/baeldung/ex/beancreationexception/cause9/Config.java @@ -0,0 +1,19 @@ +package com.baeldung.ex.beancreationexception.cause9; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Config { + + @Autowired + BeanFactory beanFactory; + + @Bean + public BeanB beanB() { + beanFactory.getBean("beanA"); + return new BeanB(); + } +} From 1a7d3aff21733046c7fc019e1c3da01c3b9a87a8 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 21 Oct 2023 20:10:35 +0300 Subject: [PATCH 201/831] JAVA-23808 Rewrite Custom Spliterator Section of Introduction to Spliterator Article --- .../spliterator/CustomSpliterator.java | 48 ++++++++++++++++++ .../com/baeldung/spliterator/Executor.java | 12 ----- .../spliterator/RelatedAuthorCounter.java | 27 ---------- .../spliterator/RelatedAuthorSpliterator.java | 49 ------------------ .../spliterator/ExecutorUnitTest.java | 50 ++++++++++++++----- 5 files changed, 86 insertions(+), 100 deletions(-) create mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/CustomSpliterator.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/Executor.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorCounter.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorSpliterator.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/CustomSpliterator.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/CustomSpliterator.java new file mode 100644 index 0000000000..2f806cccda --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/CustomSpliterator.java @@ -0,0 +1,48 @@ +package com.baeldung.spliterator; + +import java.util.List; +import java.util.Spliterator; +import java.util.function.Consumer; + +public class CustomSpliterator implements Spliterator { + private final List elements; + private int currentIndex; + + public CustomSpliterator(List elements) { + this.elements = elements; + this.currentIndex = 0; + } + + @Override + public boolean tryAdvance(Consumer action) { + if (currentIndex < elements.size()) { + action.accept(elements.get(currentIndex)); + currentIndex++; + return true; + } + return false; + } + + @Override + public Spliterator trySplit() { + int currentSize = elements.size() - currentIndex; + if (currentSize < 2) { + return null; + } + + int splitIndex = currentIndex + currentSize / 2; + CustomSpliterator newSpliterator = new CustomSpliterator(elements.subList(currentIndex, splitIndex)); + currentIndex = splitIndex; + return newSpliterator; + } + + @Override + public long estimateSize() { + return elements.size() - currentIndex; + } + + @Override + public int characteristics() { + return ORDERED | SIZED | SUBSIZED | NONNULL; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/Executor.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/Executor.java deleted file mode 100644 index 3dc2fa06bb..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/Executor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.spliterator; - -import java.util.stream.Stream; - -public class Executor { - - public static int countAutors(Stream stream) { - RelatedAuthorCounter wordCounter = stream.reduce(new RelatedAuthorCounter(0, true), - RelatedAuthorCounter::accumulate, RelatedAuthorCounter::combine); - return wordCounter.getCounter(); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorCounter.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorCounter.java deleted file mode 100644 index 8800eac55b..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorCounter.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.spliterator; - -public class RelatedAuthorCounter { - private final int counter; - private final boolean isRelated; - - public RelatedAuthorCounter(int counter, boolean isRelated) { - this.counter = counter; - this.isRelated = isRelated; - } - - public RelatedAuthorCounter accumulate(Author author) { - if (author.getRelatedArticleId() == 0) { - return isRelated ? this : new RelatedAuthorCounter(counter, true); - } else { - return isRelated ? new RelatedAuthorCounter(counter + 1, false) : this; - } - } - - public RelatedAuthorCounter combine(RelatedAuthorCounter RelatedAuthorCounter) { - return new RelatedAuthorCounter(counter + RelatedAuthorCounter.counter, RelatedAuthorCounter.isRelated); - } - - public int getCounter() { - return counter; - } -} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorSpliterator.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorSpliterator.java deleted file mode 100644 index 93c83b8127..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/spliterator/RelatedAuthorSpliterator.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.spliterator; - -import java.util.List; -import java.util.Spliterator; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - -public class RelatedAuthorSpliterator implements Spliterator { - private final List list; - AtomicInteger current = new AtomicInteger(); - - public RelatedAuthorSpliterator(List list) { - this.list = list; - } - - @Override - public boolean tryAdvance(Consumer action) { - - action.accept(list.get(current.getAndIncrement())); - return current.get() < list.size(); - } - - @Override - public Spliterator trySplit() { - int currentSize = list.size() - current.get(); - if (currentSize < 10) { - return null; - } - for (int splitPos = currentSize / 2 + current.intValue(); splitPos < list.size(); splitPos++) { - if (list.get(splitPos).getRelatedArticleId() == 0) { - Spliterator spliterator = new RelatedAuthorSpliterator(list.subList(current.get(), splitPos)); - current.set(splitPos); - return spliterator; - } - } - return null; - } - - @Override - public long estimateSize() { - return list.size() - current.get(); - } - - @Override - public int characteristics() { - return CONCURRENT; - } - -} diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/spliterator/ExecutorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/spliterator/ExecutorUnitTest.java index 4628f95481..30760ddf6f 100644 --- a/core-java-modules/core-java-8/src/test/java/com/baeldung/spliterator/ExecutorUnitTest.java +++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/spliterator/ExecutorUnitTest.java @@ -6,10 +6,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Spliterator; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.stream.StreamSupport; - import org.junit.Before; import org.junit.Test; @@ -18,22 +18,50 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class ExecutorUnitTest { Article article; - Stream stream; - Spliterator spliterator; @Before public void init() { article = new Article(Arrays.asList(new Author("Ahmad", 0), new Author("Eugen", 0), new Author("Alice", 1), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Michał", 0), new Author("Loredana", 1)), 0); - - spliterator = new RelatedAuthorSpliterator(article.getListOfAuthors()); } @Test - public void givenAstreamOfAuthors_whenProcessedInParallelWithCustomSpliterator_coubtProducessRightOutput() { - Stream stream2 = StreamSupport.stream(spliterator, true); - assertThat(Executor.countAutors(stream2.parallel())).isEqualTo(9); + public void givenAStreamOfIntegers_whenProcessedSequentialCustomSpliterator_countProducesRightOutput() { + List numbers = new ArrayList<>(); + numbers.add(1); + numbers.add(2); + numbers.add(3); + numbers.add(4); + numbers.add(5); + + CustomSpliterator customSpliterator = new CustomSpliterator(numbers); + + AtomicInteger sum = new AtomicInteger(); + + customSpliterator.forEachRemaining(sum::addAndGet); + assertThat(sum.get()).isEqualTo(15); + } + + @Test + public void givenAStreamOfIntegers_whenProcessedInParallelWithCustomSpliterator_countProducesRightOutput() { + List numbers = new ArrayList<>(); + numbers.add(1); + numbers.add(2); + numbers.add(3); + numbers.add(4); + numbers.add(5); + + CustomSpliterator customSpliterator = new CustomSpliterator(numbers); + + // Create a ForkJoinPool for parallel processing + ForkJoinPool forkJoinPool = ForkJoinPool.commonPool(); + + AtomicInteger sum = new AtomicInteger(0); + + // Process elements in parallel using parallelStream + forkJoinPool.submit(() -> customSpliterator.forEachRemaining(sum::addAndGet)).join(); + assertThat(sum.get()).isEqualTo(15); } @Test @@ -43,9 +71,7 @@ public class ExecutorUnitTest { .collect(Collectors.toList()); Spliterator
spliterator = articles.spliterator(); - while (spliterator.tryAdvance(article -> article.setName(article.getName() - .concat("- published by Baeldung")))) - ; + while(spliterator.tryAdvance(article -> article.setName(article.getName().concat("- published by Baeldung")))); articles.forEach(article -> assertThat(article.getName()).isEqualTo("Java- published by Baeldung")); } From b17ab69f4d06ff9347ae9a778d08b86358f7fcb2 Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 21 Oct 2023 19:15:13 +0100 Subject: [PATCH 202/831] Update HttpSecurityConfig.java --- .../HttpSecurityConfig.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java index 47c4c8de4c..d6361255e5 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java @@ -14,16 +14,16 @@ public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { // Given: HttpSecurity configured http.authorizeRequests() - .antMatchers("/public/**").permitAll() - .antMatchers("/admin/**").hasRole("ADMIN") - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .and() - .logout() - .permitAll(); + .antMatchers("/public/**").permitAll() + .antMatchers("/admin/**").hasRole("ADMIN") + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .permitAll(); // When: Accessing specific URLs // Then: Access is granted based on defined rules From 643da8039189ef8cf586c0af647f28df4c87681b Mon Sep 17 00:00:00 2001 From: Rufina Uche <102101377+Finniki@users.noreply.github.com> Date: Sat, 21 Oct 2023 19:17:05 +0100 Subject: [PATCH 203/831] Update WebSecurityConfig.java --- .../httpsecurityvswebsecurity/WebSecurityConfig.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 702becbf06..46a82918aa 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -25,11 +25,11 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/") - .permitAll() - .anyRequest() - .authenticated() - .and() - .formLogin(); + .antMatchers("/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin(); } } From 8282238126d5cf8a04a60039fa1604534ecc5ae9 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 21 Oct 2023 22:49:58 +0300 Subject: [PATCH 204/831] JAVA-25525 Verify reactive-systems module --- reactive-systems/docker-compose.yml | 18 ++++++++++++++++++ reactive-systems/inventory-service/Dockerfile | 2 +- reactive-systems/order-service/Dockerfile | 2 +- reactive-systems/shipping-service/Dockerfile | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 reactive-systems/docker-compose.yml diff --git a/reactive-systems/docker-compose.yml b/reactive-systems/docker-compose.yml new file mode 100644 index 0000000000..2e40d1999a --- /dev/null +++ b/reactive-systems/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + frontend: + build: ./frontend + ports: + - "80:80" + order-service: + build: ./order-service + ports: + - "8080:8080" + inventory-service: + build: ./inventory-service + ports: + - "8081:8081" + shipping-service: + build: ./shipping-service + ports: + - "8082:8082" \ No newline at end of file diff --git a/reactive-systems/inventory-service/Dockerfile b/reactive-systems/inventory-service/Dockerfile index d37887cf34..d0900decfa 100644 --- a/reactive-systems/inventory-service/Dockerfile +++ b/reactive-systems/inventory-service/Dockerfile @@ -1,3 +1,3 @@ FROM openjdk:8-jdk-alpine -COPY target/inventory-service-async-0.0.1-SNAPSHOT.jar app.jar +COPY target/inventory-service-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker","/app.jar"] \ No newline at end of file diff --git a/reactive-systems/order-service/Dockerfile b/reactive-systems/order-service/Dockerfile index 516e088a05..e48c19c2b1 100644 --- a/reactive-systems/order-service/Dockerfile +++ b/reactive-systems/order-service/Dockerfile @@ -1,3 +1,3 @@ FROM openjdk:8-jdk-alpine -COPY target/order-service-async-0.0.1-SNAPSHOT.jar app.jar +COPY target/order-service-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker","/app.jar"] \ No newline at end of file diff --git a/reactive-systems/shipping-service/Dockerfile b/reactive-systems/shipping-service/Dockerfile index 4906d1d9a8..ff57bb953d 100644 --- a/reactive-systems/shipping-service/Dockerfile +++ b/reactive-systems/shipping-service/Dockerfile @@ -1,3 +1,3 @@ FROM openjdk:8-jdk-alpine -COPY target/shipping-service-async-0.0.1-SNAPSHOT.jar app.jar +COPY target/shipping-service-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker","/app.jar"] \ No newline at end of file From 781a1c265a44ef9e272dd63da4c17f0bda9c447a Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Sun, 22 Oct 2023 09:49:38 +0530 Subject: [PATCH 205/831] [BAEL-6623] Add code for Convert Object to String (#15000) * Add Person class * Add Unit tests for Person class * Add Person class * Add PersonWithHashCode class * Address review comments * Add PersonUnitTest class * Add PersonWithHashCodeUnitTest class * Add missing dependency * Remove redundant code * Remove redundant code * Address review comments * Address review comments --- .../core-java-string-conversions-3/pom.xml | 10 ++++- .../com/baeldung/objecttostring/Person.java | 34 +++++++++++++++++ .../objecttostring/PersonUnitTest.java | 38 +++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/objecttostring/Person.java create mode 100644 core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/objecttostring/PersonUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-3/pom.xml b/core-java-modules/core-java-string-conversions-3/pom.xml index ddd5f7a497..b494a03fa7 100644 --- a/core-java-modules/core-java-string-conversions-3/pom.xml +++ b/core-java-modules/core-java-string-conversions-3/pom.xml @@ -23,4 +23,12 @@ - \ No newline at end of file + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + diff --git a/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/objecttostring/Person.java b/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/objecttostring/Person.java new file mode 100644 index 0000000000..61c0bd5711 --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/objecttostring/Person.java @@ -0,0 +1,34 @@ +package com.baeldung.objecttostring; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +public class Person { + private String name; + private int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + @Override + public String toString() { + return "Person{name='" + name + "', age=" + age + '}'; + } + + public String toCustomString() { + return new ToStringBuilder(this, ToStringStyle.JSON_STYLE) + .append("name", name) + .append("age", age) + .toString(); + } +} diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/objecttostring/PersonUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/objecttostring/PersonUnitTest.java new file mode 100644 index 0000000000..7b61956dfc --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/objecttostring/PersonUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.objecttostring; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +public class PersonUnitTest { + @Test + public void givenObject_whenToString_thenConvert() { + Person person = new Person("Sarah", 28); + String expected = "Person{name='Sarah', age=28}"; + String actual = person.toString(); + assertEquals(expected, actual); + } + + @Test + public void givenObject_whenValueOf_thenConvert() { + Person person = new Person("Sarah", 28); + String expected = "Person{name='Sarah', age=28}"; + String actual = String.valueOf(person); + assertEquals(expected, actual); + } + + @Test + public void givenObject_whenConcat_thenConvert() { + Person person = new Person("Sarah", 28); + String expected = "Person{name='Sarah', age=28}"; + String actual = "" + person; + assertEquals(expected, actual); + } + + @Test + public void givenObject_whenToStringBuilder_thenConvert() { + Person person = new Person("Sarah", 28); + String expected = "{\"name\":\"Sarah\",\"age\":28}"; + String actual = person.toCustomString(); + assertEquals(expected, actual); + } +} From 034f6d8e9a81c0b8040199bb7d0d75edc63c5748 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 22 Oct 2023 13:38:41 +0530 Subject: [PATCH 206/831] Update README.md (#15033) * Update README.md * Update README.md * Update README.md * Update README.md --- spring-reactive-modules/spring-reactive-2/README.md | 2 +- spring-reactive-modules/spring-reactive-3/README.md | 2 +- spring-reactive-modules/spring-reactive-client-2/README.md | 2 +- spring-reactive-modules/spring-reactive-client/README.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-2/README.md b/spring-reactive-modules/spring-reactive-2/README.md index a6a4c4f5d0..dbaebc370e 100644 --- a/spring-reactive-modules/spring-reactive-2/README.md +++ b/spring-reactive-modules/spring-reactive-2/README.md @@ -9,4 +9,4 @@ This module contains articles about reactive Spring Boot. - [Backpressure Mechanism in Spring WebFlux](https://www.baeldung.com/spring-webflux-backpressure) - [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) - [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) -- More articles: [[<-- prev]](../spring-5-reactive) [[next -->]](../spring-5-reactive-3) +- More articles: [[<-- prev]](../spring-reactive) [[next -->]](../spring-reactive-3) diff --git a/spring-reactive-modules/spring-reactive-3/README.md b/spring-reactive-modules/spring-reactive-3/README.md index 631763fa59..4dbaa93226 100644 --- a/spring-reactive-modules/spring-reactive-3/README.md +++ b/spring-reactive-modules/spring-reactive-3/README.md @@ -8,4 +8,4 @@ This module contains articles about reactive Spring Boot. - [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) - [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- More articles: [[<-- prev]](../spring-5-reactive-2) +- More articles: [[<-- prev]](../spring-reactive-2) diff --git a/spring-reactive-modules/spring-reactive-client-2/README.md b/spring-reactive-modules/spring-reactive-client-2/README.md index 04fe3c8f42..6b6a480f46 100644 --- a/spring-reactive-modules/spring-reactive-client-2/README.md +++ b/spring-reactive-modules/spring-reactive-client-2/README.md @@ -8,4 +8,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles - [Limiting the Requests per Second With WebClient](https://www.baeldung.com/spring-webclient-limit-requests-per-second) - [Stream Large Byte[] to File With WebClient](https://www.baeldung.com/webclient-stream-large-byte-array-to-file) -- More articles: [[<-- prev]](../spring-5-reactive-client) +- More articles: [[<-- prev]](../spring-reactive-client) diff --git a/spring-reactive-modules/spring-reactive-client/README.md b/spring-reactive-modules/spring-reactive-client/README.md index fc67a4f16e..ae72dc0e4a 100644 --- a/spring-reactive-modules/spring-reactive-client/README.md +++ b/spring-reactive-modules/spring-reactive-client/README.md @@ -13,4 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Upload a File with WebClient](https://www.baeldung.com/spring-webclient-upload-file) - [How to Get Response Body When Testing the Status Code in WebFlux WebClient](https://www.baeldung.com/spring-webclient-get-response-body) - [Spring Boot FeignClient vs. WebClient](https://www.baeldung.com/spring-boot-feignclient-vs-webclient) -- More articles: [[next -->]](../spring-5-reactive-client-2) +- More articles: [[next -->]](../spring-reactive-client-2) From 6e470ca730700b33d56a3ee870575d71b12a0464 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Sun, 22 Oct 2023 17:39:12 +0530 Subject: [PATCH 207/831] JAVA-25111: Adding missed modules (#14805) --- core-java-modules/pom.xml | 5 +++++ pom.xml | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 9bfd17125c..2152b90bcb 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -193,6 +193,11 @@ core-java-collections-maps-6 core-java-records core-java-9-jigsaw + + core-java-collections-set + core-java-date-operations-1 + + core-java-httpclient diff --git a/pom.xml b/pom.xml index 517495d7b1..3f4da4bdb0 100644 --- a/pom.xml +++ b/pom.xml @@ -692,6 +692,7 @@ + parent-boot-3 lombok-modules osgi spring-katharsis @@ -931,7 +932,8 @@ language-interop gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j - parent-boot-3 + gcp-firebase + spring-di-4 spring-kafka-2 @@ -967,6 +969,7 @@ + parent-boot-3 lombok-modules osgi spring-katharsis @@ -1040,6 +1043,14 @@ core-java-modules gcp-firebase + + + + + + + + spring-aop spring-aop-2 custom-pmd @@ -1208,6 +1219,8 @@ gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j spring-actuator + gcp-firebase + spring-di-4 spring-kafka-2 @@ -1225,7 +1238,6 @@ parent-boot-1 parent-boot-2 - parent-boot-3 parent-spring-4 parent-spring-5 parent-spring-6 From 193fa95e8c59bdb0dcba55b0319bc1a05f1bcc54 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 22 Oct 2023 14:40:23 +0200 Subject: [PATCH 208/831] JAVA-26042 | updated to spring-boot-3 (#14983) --- .../spring-data-jpa-query-2/pom.xml | 20 ++++-- .../hibernate/fetching/model/OrderDetail.java | 2 +- .../hibernate/fetching/model/UserEager.java | 2 +- .../hibernate/fetching/model/UserLazy.java | 2 +- .../dao/common/AbstractJpaDao.java | 12 ++-- .../com/baeldung/persistence/model/Bar.java | 30 ++++----- .../com/baeldung/persistence/model/Child.java | 8 +-- .../com/baeldung/persistence/model/Foo.java | 28 ++++---- .../baeldung/persistence/model/Parent.java | 12 ++-- .../baeldung/persistence/model/Person.java | 6 +- .../baeldung/spring/data/jpa/query/User.java | 2 +- .../jpa/query/UserRepositoryCustomImpl.java | 6 +- .../audit/JPABarAuditIntegrationTest.java | 10 +-- .../SpringDataJPABarAuditIntegrationTest.java | 8 +-- .../persistence/hibernate/FooFixtures.java | 31 +++------ ...oPaginationPersistenceIntegrationTest.java | 67 ++++++++++--------- .../FooSortingPersistenceIntegrationTest.java | 67 +++++++++++++------ .../service/FooStoredProceduresLiveTest.java | 36 +++++----- 18 files changed, 188 insertions(+), 161 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml index c74c35c37b..1282d1d8a0 100644 --- a/persistence-modules/spring-data-jpa-query-2/pom.xml +++ b/persistence-modules/spring-data-jpa-query-2/pom.xml @@ -1,16 +1,16 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-data-jpa-query-2 spring-data-jpa-query-2 com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -38,6 +38,7 @@ mysql mysql-connector-java + 3.1.12 com.google.guava @@ -50,12 +51,19 @@ ${tomcat-dbcp.version} - org.hibernate + org.hibernate.orm hibernate-core + 6.3.1.Final - org.hibernate + org.hibernate.orm hibernate-envers + 6.3.1.Final + + + org.apache.commons + commons-lang3 + 3.13.0 org.springframework diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java index f4a9b8a678..70349a664d 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.fetching.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; import java.sql.Date; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java index 9fda4c43bb..d273f942a5 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.fetching.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java index a78eaa4ac0..6d18b2517c 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java @@ -1,6 +1,6 @@ package com.baeldung.hibernate.fetching.model; -import javax.persistence.*; +import jakarta.persistence.*; import java.io.Serializable; import java.util.HashSet; import java.util.Set; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java index 79bdd86658..d43ee46844 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java @@ -3,12 +3,12 @@ package com.baeldung.persistence.dao.common; import java.io.Serializable; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; public class AbstractJpaDao extends AbstractDao implements IOperations { diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Bar.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Bar.java index 0ceb2d5626..15a4fdb3ca 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Bar.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Bar.java @@ -3,29 +3,29 @@ package com.baeldung.persistence.model; import com.google.common.collect.Sets; import org.hibernate.annotations.OrderBy; import org.hibernate.envers.Audited; -import org.jboss.logging.Logger; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.PrePersist; -import javax.persistence.PreRemove; -import javax.persistence.PreUpdate; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreRemove; +import jakarta.persistence.PreUpdate; import java.io.Serializable; import java.util.Date; import java.util.Set; +import java.util.logging.Logger; @Entity @NamedQuery(name = "Bar.findAll", query = "SELECT b FROM Bar b") @@ -33,7 +33,7 @@ import java.util.Set; @EntityListeners(AuditingEntityListener.class) public class Bar implements Serializable { - private static final Logger LOGGER = Logger.getLogger(Bar.class); + private static final Logger LOGGER = Logger.getLogger(Bar.class.toString()); public enum OPERATION { INSERT, UPDATE, DELETE; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Child.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Child.java index 19cfb2e237..9a1f95c019 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Child.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Child.java @@ -2,10 +2,10 @@ package com.baeldung.persistence.model; import java.io.Serializable; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; @Entity public class Child implements Serializable { diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java index ac79653b2b..b7e8adba42 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Foo.java @@ -2,20 +2,20 @@ package com.baeldung.persistence.model; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedNativeQueries; -import javax.persistence.NamedNativeQuery; -import javax.persistence.NamedStoredProcedureQuery; -import javax.persistence.ParameterMode; -import javax.persistence.StoredProcedureParameter; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedNativeQueries; +import jakarta.persistence.NamedNativeQuery; +import jakarta.persistence.NamedStoredProcedureQuery; +import jakarta.persistence.ParameterMode; +import jakarta.persistence.StoredProcedureParameter; import org.hibernate.envers.Audited; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Parent.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Parent.java index fa6948990b..4149a0b883 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Parent.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Parent.java @@ -2,12 +2,12 @@ package com.baeldung.persistence.model; import java.io.Serializable; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; @Entity public class Parent implements Serializable { diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Person.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Person.java index 6a95a7acf5..3766639975 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Person.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/persistence/model/Person.java @@ -1,8 +1,8 @@ package com.baeldung.persistence.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; @Entity public class Person { diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/User.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/User.java index 179dbf2ae7..648b06cf5f 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/User.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/User.java @@ -1,6 +1,6 @@ package com.baeldung.spring.data.jpa.query; -import javax.persistence.*; +import jakarta.persistence.*; import java.time.LocalDate; import java.util.List; import java.util.Objects; diff --git a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/UserRepositoryCustomImpl.java b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/UserRepositoryCustomImpl.java index 033f61fdd3..54cea74e04 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/UserRepositoryCustomImpl.java +++ b/persistence-modules/spring-data-jpa-query-2/src/main/java/com/baeldung/spring/data/jpa/query/UserRepositoryCustomImpl.java @@ -1,8 +1,8 @@ package com.baeldung.spring.data.jpa.query; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.criteria.*; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.criteria.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java index f591773cde..d9ab75af2c 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java @@ -4,8 +4,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.junit.After; import org.junit.AfterClass; @@ -30,15 +30,15 @@ import com.baeldung.spring.config.PersistenceTestConfig; @ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) public class JPABarAuditIntegrationTest { - private static Logger logger = LoggerFactory.getLogger(JPABarAuditIntegrationTest.class); + private static final Logger logger = LoggerFactory.getLogger(JPABarAuditIntegrationTest.class); @BeforeClass - public static void setUpBeforeClass() throws Exception { + public static void setUpBeforeClass() { logger.info("setUpBeforeClass()"); } @AfterClass - public static void tearDownAfterClass() throws Exception { + public static void tearDownAfterClass(){ logger.info("tearDownAfterClass()"); } diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java index 0603067810..0d22562a93 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java @@ -3,8 +3,8 @@ package com.baeldung.persistence.audit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.junit.After; import org.junit.AfterClass; @@ -29,7 +29,7 @@ import com.baeldung.spring.config.PersistenceTestConfig; @ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) public class SpringDataJPABarAuditIntegrationTest { - private static Logger logger = LoggerFactory.getLogger(SpringDataJPABarAuditIntegrationTest.class); + private static final Logger logger = LoggerFactory.getLogger(SpringDataJPABarAuditIntegrationTest.class); @BeforeClass public static void setUpBeforeClass() throws Exception { @@ -37,7 +37,7 @@ public class SpringDataJPABarAuditIntegrationTest { } @AfterClass - public static void tearDownAfterClass() throws Exception { + public static void tearDownAfterClass(){ logger.info("tearDownAfterClass()"); } diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java index a7763bb0f8..92a9d8e2ec 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java @@ -17,7 +17,7 @@ public class FooFixtures { private static final Logger LOGGER = LoggerFactory.getLogger(FooFixtures.class); - private SessionFactory sessionFactory; + private final SessionFactory sessionFactory; public FooFixtures(final SessionFactory sessionFactory) { super(); @@ -28,8 +28,8 @@ public class FooFixtures { // API public void createBars() { - Session session = null; - Transaction tx = null; + Session session; + Transaction tx; session = sessionFactory.openSession(); tx = session.getTransaction(); try { @@ -39,13 +39,13 @@ public class FooFixtures { bar.setName("Bar_" + i); final Foo foo = new Foo("Foo_" + (i + 120)); foo.setBar(bar); - session.save(foo); + session.persist(foo); final Foo foo2 = new Foo(null); if (i % 2 == 0) { foo2.setName("LuckyFoo" + (i + 120)); } foo2.setBar(bar); - session.save(foo2); + session.persist(foo2); bar.getFooSet().add(foo); bar.getFooSet().add(foo2); session.merge(bar); @@ -53,16 +53,12 @@ public class FooFixtures { tx.commit(); session.flush(); } catch (final HibernateException he) { - if (tx != null) { - tx.rollback(); - } + tx.rollback(); LOGGER.error("Not able to open session", he); } catch (final Exception e) { LOGGER.error(e.getLocalizedMessage(), e); } finally { - if (session != null) { - session.close(); - } + session.close(); } } @@ -86,23 +82,18 @@ public class FooFixtures { try { tx.begin(); for (final Foo foo : fooList) { - - session.save(foo.getBar()); - session.save(foo); + session.persist(foo.getBar()); + session.persist(foo); } tx.commit(); session.flush(); } catch (final HibernateException he) { - if (tx != null) { - tx.rollback(); - } + tx.rollback(); LOGGER.error("Not able to open session", he); } catch (final Exception e) { LOGGER.error(e.getLocalizedMessage(), e); } finally { - if (session != null) { - session.close(); - } + session.close(); } } diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java index fd7bc4aabf..528eed9d8d 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java @@ -1,19 +1,19 @@ package com.baeldung.persistence.hibernate; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.lessThan; -import static org.junit.Assert.assertThat; import java.util.List; -import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.criterion.Projections; +import org.hibernate.query.Query; +import org.hibernate.query.SelectionQuery; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -28,6 +28,8 @@ import com.baeldung.persistence.service.IFooService; import com.baeldung.spring.config.PersistenceTestConfig; import com.google.common.collect.Lists; +import jakarta.persistence.criteria.CriteriaQuery; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) public class FooPaginationPersistenceIntegrationTest { @@ -40,8 +42,6 @@ public class FooPaginationPersistenceIntegrationTest { private Session session; - // tests - @Before public final void before() { final int minimalNumberOfEntities = 25; @@ -59,20 +59,17 @@ public class FooPaginationPersistenceIntegrationTest { session.close(); } - // tests - @Test public final void whenContextIsBootstrapped_thenNoExceptions() { // } - @SuppressWarnings("unchecked") @Test public final void whenRetrievingPaginatedEntities_thenCorrectSize() { final int pageNumber = 1; final int pageSize = 10; - final Query query = session.createQuery("From Foo"); + final Query query = session.createQuery("From Foo",Foo.class); query.setFirstResult((pageNumber - 1) * pageSize); query.setMaxResults(pageSize); final List fooList = query.list(); @@ -80,19 +77,18 @@ public class FooPaginationPersistenceIntegrationTest { assertThat(fooList, hasSize(pageSize)); } - @SuppressWarnings("unchecked") @Test public final void whenRetrievingAllPages_thenCorrect() { int pageNumber = 1; final int pageSize = 10; final String countQ = "Select count (f.id) from Foo f"; - final Query countQuery = session.createQuery(countQ); + final Query countQuery = session.createQuery(countQ, Long.class); final Long countResult = (Long) countQuery.uniqueResult(); final List fooList = Lists.newArrayList(); int totalEntities = 0; - final Query query = session.createQuery("From Foo"); + final Query query = session.createQuery("From Foo", Foo.class); while (totalEntities < countResult) { query.setFirstResult((pageNumber - 1) * pageSize); query.setMaxResults(pageSize); @@ -102,17 +98,16 @@ public class FooPaginationPersistenceIntegrationTest { } } - @SuppressWarnings("unchecked") @Test public final void whenRetrievingLastPage_thenCorrectSize() { final int pageSize = 10; final String countQ = "Select count (f.id) from Foo f"; - final Query countQuery = session.createQuery(countQ); - final Long countResults = (Long) countQuery.uniqueResult(); + final Query countQuery = session.createQuery(countQ, Long.class); + final Long countResults = countQuery.uniqueResult(); final int lastPageNumber = (int) (Math.ceil(countResults / pageSize)); - final Query selectQuery = session.createQuery("From Foo"); + final Query selectQuery = session.createQuery("From Foo",Foo.class); selectQuery.setFirstResult((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults(pageSize); final List lastPage = selectQuery.list(); @@ -126,9 +121,9 @@ public class FooPaginationPersistenceIntegrationTest { public final void givenUsingTheScrollableApi_whenRetrievingPaginatedData_thenCorrect() { final int pageSize = 10; final String hql = "FROM Foo f order by f.name"; - final Query query = session.createQuery(hql); + final Query query = session.createQuery(hql,Foo.class); - final ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY); + final ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY); // resultScroll.last(); // final int totalResults = resultScroll.getRowNumber() + 1; @@ -138,7 +133,7 @@ public class FooPaginationPersistenceIntegrationTest { final List fooPage = Lists.newArrayList(); int i = 0; while (pageSize > i++) { - fooPage.add((Foo) resultScroll.get(0)); + fooPage.add((Foo) resultScroll.get()); if (!resultScroll.next()) { break; } @@ -147,36 +142,42 @@ public class FooPaginationPersistenceIntegrationTest { assertThat(fooPage, hasSize(lessThan(10 + 1))); } - @SuppressWarnings("unchecked") @Test public final void givenUsingTheCriteriaApi_whenRetrievingFirstPage_thenCorrect() { final int pageSize = 10; - final Criteria criteria = session.createCriteria(Foo.class); - criteria.setFirstResult(0); - criteria.setMaxResults(pageSize); - final List firstPage = criteria.list(); + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + + SelectionQuery query = session.createQuery(selectQuery); + query.setFirstResult(0); + query.setMaxResults(pageSize); + final List firstPage = query.list(); assertThat(firstPage, hasSize(pageSize)); } - @SuppressWarnings("unchecked") @Test public final void givenUsingTheCriteriaApi_whenRetrievingPaginatedData_thenCorrect() { - final Criteria criteriaCount = session.createCriteria(Foo.class); - criteriaCount.setProjection(Projections.rowCount()); - final Long count = (Long) criteriaCount.uniqueResult(); + + HibernateCriteriaBuilder qb = session.getCriteriaBuilder(); + CriteriaQuery cq = qb.createQuery(Long.class); + cq.select(qb.count(cq.from(Foo.class))); + final Long count = session.createQuery(cq).getSingleResult(); int pageNumber = 1; final int pageSize = 10; final List fooList = Lists.newArrayList(); - final Criteria criteria = session.createCriteria(Foo.class); + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + SelectionQuery query = session.createQuery(selectQuery); + int totalEntities = 0; while (totalEntities < count.intValue()) { - criteria.setFirstResult((pageNumber - 1) * pageSize); - criteria.setMaxResults(pageSize); - fooList.addAll(criteria.list()); + query.setFirstResult((pageNumber - 1) * pageSize); + query.setMaxResults(pageSize); + fooList.addAll(query.list()); totalEntities = fooList.size(); pageNumber++; } diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java index 6078eb3af0..7e2d23da96 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java @@ -2,15 +2,17 @@ package com.baeldung.persistence.hibernate; import static org.junit.Assert.assertNull; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; -import org.hibernate.Criteria; -import org.hibernate.NullPrecedence; -import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.criterion.Order; +import org.hibernate.query.NullPrecedence; +import org.hibernate.query.Order; +import org.hibernate.query.Query; +import org.hibernate.query.SortDirection; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -26,6 +28,8 @@ import com.baeldung.persistence.model.Bar; import com.baeldung.persistence.model.Foo; import com.baeldung.spring.config.PersistenceTestConfig; +import jakarta.persistence.criteria.CriteriaQuery; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceTestConfig.class }, loader = AnnotationConfigContextLoader.class) @SuppressWarnings("unchecked") @@ -91,7 +95,7 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenHQlSortingByOneAttribute_andOrderDirection_thenPrintSortedResults() { final String hql = "FROM Foo f ORDER BY f.name ASC"; - final Query query = session.createQuery(hql); + Query query = session.createQuery(hql, Foo.class); final List fooList = query.list(); for (final Foo foo : fooList) { LOGGER.debug("Name: {}, Id: {}", foo.getName(), foo.getId()); @@ -101,7 +105,7 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenHQlSortingByMultipleAttributes_thenSortedResults() { final String hql = "FROM Foo f ORDER BY f.name, f.id"; - final Query query = session.createQuery(hql); + Query query = session.createQuery(hql, Foo.class); final List fooList = query.list(); for (final Foo foo : fooList) { LOGGER.debug("Name: {}, Id: {}", foo.getName(), foo.getId()); @@ -111,7 +115,7 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenHQlSortingByMultipleAttributes_andOrderDirection_thenPrintSortedResults() { final String hql = "FROM Foo f ORDER BY f.name DESC, f.id ASC"; - final Query query = session.createQuery(hql); + Query query = session.createQuery(hql, Foo.class); final List fooList = query.list(); for (final Foo foo : fooList) { LOGGER.debug("Name: {}, Id: {}", foo.getName(), foo.getId()); @@ -120,9 +124,12 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenHQLCriteriaSortingByOneAttr_thenPrintSortedResults() { - final Criteria criteria = session.createCriteria(Foo.class, "FOO"); - criteria.addOrder(Order.asc("id")); - final List fooList = criteria.list(); + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + Query query = session.createQuery(selectQuery); + + query.setOrder(Collections.singletonList(Order.asc(Foo.class,"id"))); + final List fooList = query.list(); for (final Foo foo : fooList) { LOGGER.debug("Id: {}, FirstName: {}", foo.getId(), foo.getName()); } @@ -130,10 +137,16 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenHQLCriteriaSortingByMultipAttr_thenSortedResults() { - final Criteria criteria = session.createCriteria(Foo.class, "FOO"); - criteria.addOrder(Order.asc("name")); - criteria.addOrder(Order.asc("id")); - final List fooList = criteria.list(); + + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + Query query = session.createQuery(selectQuery); + + List> orderBy = new ArrayList<>(2); + orderBy.add(Order.asc(Foo.class,"name")); + orderBy.add(Order.asc(Foo.class,"id")); + query.setOrder(orderBy); + final List fooList = query.list(); for (final Foo foo : fooList) { LOGGER.debug("Id: {}, FirstName: {}", foo.getId(), foo.getName()); } @@ -141,9 +154,15 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenCriteriaSortingStringNullsLastAsc_thenNullsLast() { - final Criteria criteria = session.createCriteria(Foo.class, "FOO"); - criteria.addOrder(Order.asc("name").nulls(NullPrecedence.LAST)); - final List fooList = criteria.list(); + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + Query query = session.createQuery(selectQuery); + + List> orderBy = new ArrayList<>(2); + orderBy.add(Order.by(Foo.class,"name", SortDirection.ASCENDING, NullPrecedence.LAST)); + query.setOrder(orderBy); + + final List fooList = query.list(); assertNull(fooList.get(fooList.toArray().length - 1).getName()); for (final Foo foo : fooList) { LOGGER.debug("Id: {}, FirstName: {}", foo.getId(), foo.getName()); @@ -152,9 +171,15 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenCriteriaSortingStringNullsFirstDesc_thenNullsFirst() { - final Criteria criteria = session.createCriteria(Foo.class, "FOO"); - criteria.addOrder(Order.desc("name").nulls(NullPrecedence.FIRST)); - final List fooList = criteria.list(); + CriteriaQuery selectQuery = session.getCriteriaBuilder().createQuery(Foo.class); + selectQuery.from(Foo.class); + Query query = session.createQuery(selectQuery); + + List> orderBy = new ArrayList<>(2); + orderBy.add(Order.by(Foo.class,"name", SortDirection.ASCENDING, NullPrecedence.FIRST)); + query.setOrder(orderBy); + + final List fooList = query.list(); assertNull(fooList.get(0).getName()); for (final Foo foo : fooList) { LOGGER.debug("Id: {}, FirstName: {}", foo.getId(), foo.getName()); @@ -164,7 +189,7 @@ public class FooSortingPersistenceIntegrationTest { @Test public final void whenSortingBars_thenBarsWithSortedFoos() { final String hql = "FROM Bar b ORDER BY b.id"; - final Query query = session.createQuery(hql); + final Query query = session.createQuery(hql, Bar.class); final List barList = query.list(); for (final Bar bar : barList) { final Set fooSet = bar.getFooSet(); diff --git a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java index f6dedfc6de..d8216fc072 100644 --- a/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java +++ b/persistence-modules/spring-data-jpa-query-2/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java @@ -5,14 +5,14 @@ import static org.junit.Assert.assertEquals; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.StoredProcedureQuery; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.StoredProcedureQuery; -import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.exception.SQLGrammarException; +import org.hibernate.query.Query; import org.junit.After; import org.junit.Assume; import org.junit.Before; @@ -59,22 +59,22 @@ public class FooStoredProceduresLiveTest { private boolean getFoosByNameExists() { try { - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class); + Query sqlQuery = session.createNativeQuery("CALL GetFoosByName()",Foo.class); sqlQuery.list(); return true; } catch (SQLGrammarException e) { - LOGGER.error("WARNING : GetFoosByName() Procedure is may be missing ", e); + LOGGER.error("WARNING : GetFoosByName() Procedure may be missing ", e); return false; } } private boolean getAllFoosExists() { try { - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class); + Query sqlQuery = session.createNativeQuery("CALL GetAllFoos()",Foo.class); sqlQuery.list(); return true; } catch (SQLGrammarException e) { - LOGGER.error("WARNING : GetAllFoos() Procedure is may be missing ", e); + LOGGER.error("WARNING : GetAllFoos() Procedure may be missing ", e); return false; } } @@ -90,9 +90,9 @@ public class FooStoredProceduresLiveTest { fooService.create(new Foo(randomAlphabetic(6))); - // Stored procedure getAllFoos using createSQLQuery - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class); - @SuppressWarnings("unchecked") + // Stored procedure getAllFoos using createQuery + Query sqlQuery = session.createNativeQuery("CALL GetAllFoos()", Foo.class); + List allFoos = sqlQuery.list(); for (Foo foo : allFoos) { LOGGER.info("getAllFoos() SQL Query result : {}", foo.getName()); @@ -100,8 +100,8 @@ public class FooStoredProceduresLiveTest { assertEquals(allFoos.size(), fooService.findAll().size()); // Stored procedure getAllFoos using a Named Query - Query namedQuery = session.getNamedQuery("callGetAllFoos"); - @SuppressWarnings("unchecked") + Query namedQuery = session.createNamedQuery("callGetAllFoos", Foo.class); + List allFoos2 = namedQuery.list(); for (Foo foo : allFoos2) { LOGGER.info("getAllFoos() NamedQuery result : {}", foo.getName()); @@ -110,6 +110,7 @@ public class FooStoredProceduresLiveTest { StoredProcedureQuery spQuery = entityManager.createNamedStoredProcedureQuery("GetAllFoos"); + @SuppressWarnings("unchecked") List allFoos3 = spQuery.getResultList(); for (Foo foo : allFoos3) { LOGGER.info("getAllFoos() StoredProcedureQuery result : {}", foo.getName()); @@ -124,16 +125,16 @@ public class FooStoredProceduresLiveTest { fooService.create(new Foo("NewFooName")); // Stored procedure getFoosByName using createSQLQuery() - Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)").addEntity(Foo.class).setParameter("fooName", "NewFooName"); - @SuppressWarnings("unchecked") + Query sqlQuery = session.createNativeQuery("CALL GetFoosByName(:fooName)", Foo.class).setParameter("fooName", "NewFooName"); + List allFoosByName = sqlQuery.list(); for (Foo foo : allFoosByName) { LOGGER.info("getFoosByName() using SQL Query : found => {}", foo.toString()); } // Stored procedure getFoosByName using getNamedQuery() - Query namedQuery = session.getNamedQuery("callGetFoosByName").setParameter("fooName", "NewFooName"); - @SuppressWarnings("unchecked") + Query namedQuery = session.createQuery("callGetFoosByName", Foo.class).setParameter("fooName", "NewFooName"); + List allFoosByName2 = namedQuery.list(); for (Foo foo : allFoosByName2) { LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString()); @@ -142,6 +143,7 @@ public class FooStoredProceduresLiveTest { StoredProcedureQuery spQuery = entityManager. createNamedStoredProcedureQuery("GetFoosByName") .setParameter("fooName", "NewFooName"); + @SuppressWarnings("unchecked") List allFoosByName3 = spQuery.getResultList(); assertEquals(1, allFoosByName3.size()); for (Foo foo : allFoosByName3) { From 4cd426bb149c68448547c08622bf29e6f00887a7 Mon Sep 17 00:00:00 2001 From: Thibault Faure Date: Thu, 12 Oct 2023 20:52:32 +0200 Subject: [PATCH 209/831] BAEL-7107 Code for the article Arrays mismatch method in Java --- .../README.md | 5 + .../pom.xml | 16 ++ .../array/mismatch/ArrayMismatchUnitTest.java | 269 ++++++++++++++++++ core-java-modules/pom.xml | 1 + 4 files changed, 291 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-basic-2/README.md create mode 100644 core-java-modules/core-java-arrays-operations-basic-2/pom.xml create mode 100644 core-java-modules/core-java-arrays-operations-basic-2/src/test/java/com/baeldung/array/mismatch/ArrayMismatchUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-basic-2/README.md b/core-java-modules/core-java-arrays-operations-basic-2/README.md new file mode 100644 index 0000000000..da2f17111f --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic-2/README.md @@ -0,0 +1,5 @@ +## Core Java Arrays - Basic Operations + +This module contains articles about Java array fundamentals. They assume no previous background knowledge on working with arrays. + +### Relevant Articles: diff --git a/core-java-modules/core-java-arrays-operations-basic-2/pom.xml b/core-java-modules/core-java-arrays-operations-basic-2/pom.xml new file mode 100644 index 0000000000..7257a39462 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic-2/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-arrays-operations-basic-2 + core-java-arrays-operations-basic-2 + jar + + + core-java-modules + com.baeldung.core-java-modules + 0.0.1-SNAPSHOT + + + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-basic-2/src/test/java/com/baeldung/array/mismatch/ArrayMismatchUnitTest.java b/core-java-modules/core-java-arrays-operations-basic-2/src/test/java/com/baeldung/array/mismatch/ArrayMismatchUnitTest.java new file mode 100644 index 0000000000..464221efd0 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-basic-2/src/test/java/com/baeldung/array/mismatch/ArrayMismatchUnitTest.java @@ -0,0 +1,269 @@ +package com.baeldung.array.mismatch; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Arrays; +import java.util.Comparator; + +import org.junit.jupiter.api.Test; + +class ArrayMismatchUnitTest { + + @Test + void givenTwoArraysWithACommonPrefix_whenMismatch_thenIndexOfFirstMismatch() { + int[] firstArray = {1, 2, 3, 4, 5}; + int[] secondArray = {1, 2, 3, 5, 8}; + assertEquals(3, Arrays.mismatch(firstArray, secondArray)); + } + + @Test + void givenTwoIdenticalArrays_whenMismatch_thenMinusOne() { + int[] firstArray = {1, 2, 3, 4, 5}; + int[] secondArray = {1, 2, 3, 4, 5}; + assertEquals(-1, Arrays.mismatch(firstArray, secondArray)); + } + + @Test + void givenFirstArrayIsAPrefixOfTheSecond_whenMismatch_thenFirstArrayLength() { + int[] firstArray = {1, 2, 3, 4, 5}; + int[] secondArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + assertEquals(firstArray.length, Arrays.mismatch(firstArray, secondArray)); + } + + @Test + void givenNoCommonPrefix_whenMismatch_thenZero() { + int[] firstArray = {1, 2, 3, 4, 5}; + int[] secondArray = {9, 8, 7}; + assertEquals(0, Arrays.mismatch(firstArray, secondArray)); + } + + @Test + void givenAtLeastANullArray_whenMismatch_thenThrowsNullPointerException() { + int[] firstArray = null; + int[] secondArray = {1, 2, 3, 4, 5}; + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, secondArray)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, firstArray)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, firstArray)); + } + + @Test + void givenExactlyOneAnEmptyArray_whenMismatch_thenZero() { + int[] firstArray = {}; + int[] secondArray = {1, 2, 3}; + assertEquals(0, Arrays.mismatch(firstArray, secondArray)); + assertEquals(0, Arrays.mismatch(secondArray, firstArray)); + } + + @Test + void givenTwoEmptyArrays_whenMismatch_thenMinusOne() { + assertEquals(-1, Arrays.mismatch(new int[] {}, new int[] {})); + } + + @Test + void givenTwoSubArraysWithACommonPrefix_whenMismatch_thenIndexOfFirstMismatch() { + int[] firstArray = {1, 2, 3, 4, 5}; + int[] secondArray = {0, 1, 2, 3, 5, 8}; + assertEquals(3, Arrays.mismatch(firstArray, 0, 4, secondArray, 1, 6)); + } + + @Test + void givenTwoIdenticalSubArrays_whenMismatch_thenMinusOne() { + int[] firstArray = {0, 0, 1, 2}; + int[] secondArray = {0, 1, 2, 3, 4}; + assertEquals(-1, Arrays.mismatch(firstArray, 2, 4, secondArray, 1, 3)); + } + + @Test + void givenFirstSubArrayIsAPrefixOfTheSecond_whenMismatch_thenFirstArrayLength() { + int[] firstArray = {2, 3, 4, 5, 4, 3, 2}; + int[] secondArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + assertEquals(4, Arrays.mismatch(firstArray, 0, 4, secondArray, 2, 9)); + } + + @Test + void givenNoCommonPrefixForSubArrays_whenMismatch_thenZero() { + int[] firstArray = {0, 0, 0, 0, 0}; + int[] secondArray = {9, 8, 7, 6, 5}; + assertEquals(0, Arrays.mismatch(firstArray, 1, 2, secondArray, 1, 2)); + } + + @Test + void givenAtLeastANullSubArray_whenMismatch_thenThrowsNullPointerException() { + int[] firstArray = null; + int[] secondArray = {1, 2, 3, 4, 5}; + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, 0, 1, secondArray, 0, 1)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, 0, 1, firstArray, 0, 1)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, 0, 1, firstArray, 0, 1)); + } + + @Test + void givenExactlyOneEmptySubArray_whenMismatch_thenZero() { + int[] firstArray = {1}; + int[] secondArray = {1, 2, 3}; + assertEquals(0, Arrays.mismatch(firstArray, 0, 0, secondArray, 0, 2)); + assertEquals(0, Arrays.mismatch(firstArray, 0, 1, secondArray, 2, 2)); + } + + @Test + void givenTwoEmptySubArrays_whenMismatch_thenMinusOne() { + int[] firstArray = {1}; + int[] secondArray = {1, 2, 3}; + assertEquals(-1, Arrays.mismatch(firstArray, 0, 0, secondArray, 2, 2)); + } + + @Test + void givenToIndexGreaterThanFromIndex_whenMismatch_thenThrowsIllegalArgumentException() { + int[] firstArray = {2, 3, 4, 5, 4, 3, 2}; + int[] secondArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + assertThrows(IllegalArgumentException.class, () -> Arrays.mismatch(firstArray, 4, 2, secondArray, 0, 6)); + assertThrows(IllegalArgumentException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, 6, 0)); + } + + @Test + void givenIllegalIndexes_whenMismatch_thenThrowsArrayIndexOutOfBoundsException() { + int[] firstArray = {2, 3, 4, 5, 4, 3, 2}; + int[] secondArray = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, -1, 2, secondArray, 0, 6)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 0, 8, secondArray, 0, 6)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, -5, 0)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, 11, 12)); + } + + @Test + void givenTwoStringArraysAndAComparator_whenMismatch_thenIndexOfFirstMismatch() { + String[] firstArray = {"one", "two", "three"}; + String[] secondArray = {"ONE", "TWO", "FOUR"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(2, Arrays.mismatch(firstArray, secondArray, comparator)); + } + + @Test + void givenTwoIdenticalStringArraysForTheComparator_whenMismatch_thenMinusOne() { + String[] firstArray = {"one", "two", "three"}; + String[] secondArray = {"ONE", "TWO", "THREE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(-1, Arrays.mismatch(firstArray, secondArray, comparator)); + } + + @Test + void givenFirstStringArrayIsAPrefixOfTheSecondForTheComparator_whenMismatch_thenFirstArrayLength() { + String[] firstArray = {"one", "two", "three"}; + String[] secondArray = {"ONE", "TWO", "THREE", "FOUR", "FIVE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(firstArray.length, Arrays.mismatch(firstArray, secondArray, comparator)); + } + + @Test + void givenNoCommonPrefixForTheComparator_whenMismatch_thenZero() { + String[] firstArray = {"one", "two", "three"}; + String[] secondArray = {"six", "seven", "eight"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(0, Arrays.mismatch(firstArray, secondArray, comparator)); + } + + @Test + void givenAtLeastANullArrayOrNullComparator_whenMismatch_thenThrowsNullPointerException() { + String[] firstArray = null; + String[] secondArray = {"one"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, secondArray, comparator)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, firstArray, comparator)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, secondArray, null)); + } + + @Test + void givenExactlyOneAnEmptyArrayAndAComparator_whenMismatch_thenZero() { + String[] firstArray = {}; + String[] secondArray = {"one"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(0, Arrays.mismatch(firstArray, secondArray, comparator)); + assertEquals(0, Arrays.mismatch(secondArray, firstArray, comparator)); + } + + @Test + void givenTwoEmptyStringArraysForTheComparator_whenMismatch_thenMinusOne() { + assertEquals(-1, Arrays.mismatch(new String[] {}, new String[] {}, String.CASE_INSENSITIVE_ORDER)); + } + + @Test + void givenTwoStringSubarraysAndAComparator_whenMismatch_thenIndexOfFirstMismatch() { + String[] firstArray = {"one", "two", "three", "four"}; + String[] secondArray = {"ZERO", "ONE", "TWO", "FOUR", "EIGHT", "SIXTEEN"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(2, Arrays.mismatch(firstArray, 0, 4, secondArray, 1, 3, comparator)); + } + + @Test + void givenTwoIdenticalStringSubArraysForTheComparator_whenMismatch_thenMinusOne() { + String[] firstArray = {"zero", "zero", "one", "two"}; + String[] secondArray = {"zero", "one", "two", "three", "four"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(-1, Arrays.mismatch(firstArray, 2, 4, secondArray, 1, 3, comparator)); + } + + @Test + void givenFirstSubArrayIsAPrefixOfTheSecondForTheComparator_whenMismatch_thenFirstArrayLength() { + String[] firstArray = {"two", "three", "four", "five", "four", "three", "two"}; + String[] secondArray = {"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "EIGHT", "NINE", "TEN"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(4, Arrays.mismatch(firstArray, 0, 4, secondArray, 2, 9, comparator)); + } + + @Test + void givenNoCommonPrefixForSubArraysForTheComparator_whenMismatch_thenZero() { + String[] firstArray = {"zero", "one"}; + String[] secondArray = {"TEN", "ELEVEN", "TWELVE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(0, Arrays.mismatch(firstArray, 1, 2, secondArray, 1, 2, comparator)); + } + + @Test + void givenAtLeastANullSubArrayOrNullComparator_whenMismatch_thenThrowsNullPointerException() { + String[] firstArray = null; + String[] secondArray = {"ONE", "TWO", "THREE", "FOUR", "FIVE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, 0, 1, secondArray, 0, 1, comparator)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, 0, 1, firstArray, 0, 1, comparator)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(firstArray, 0, 1, firstArray, 0, 1, comparator)); + assertThrows(NullPointerException.class, () -> Arrays.mismatch(secondArray, 0, 1, secondArray, 0, 1, null)); + } + + @Test + void givenExactlyOneEmptySubArrayAndAComparator_whenMismatch_thenZero() { + String[] firstArray = {"one"}; + String[] secondArray = {"ONE", "TWO", "THREE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(0, Arrays.mismatch(firstArray, 0, 0, secondArray, 0, 2, comparator)); + assertEquals(0, Arrays.mismatch(firstArray, 0, 1, secondArray, 2, 2, comparator)); + } + + @Test + void givenTwoEmptySubArraysAndAComparator_whenMismatch_thenMinusOne() { + String[] firstArray = {"one"}; + String[] secondArray = {"ONE", "TWO", "THREE"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertEquals(-1, Arrays.mismatch(firstArray, 0, 0, secondArray, 2, 2, comparator)); + } + + @Test + void givenToIndexGreaterThanFromIndexAndAComparator_whenMismatch_thenThrowsIllegalArgumentException() { + String[] firstArray = {"two", "three", "four", "five", "four", "three", "two"}; + String[] secondArray = {"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "EIGHT", "NINE", "TEN"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertThrows(IllegalArgumentException.class, () -> Arrays.mismatch(firstArray, 4, 2, secondArray, 0, 6, comparator)); + assertThrows(IllegalArgumentException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, 6, 0, comparator)); + } + + @Test + void givenIllegalIndexesAndAComparator_whenMismatch_thenThrowsArrayIndexOutOfBoundsException() { + String[] firstArray = {"two", "three", "four", "five", "four", "three", "two"}; + String[] secondArray = {"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "EIGHT", "NINE", "TEN"}; + Comparator comparator = String.CASE_INSENSITIVE_ORDER; + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, -1, 2, secondArray, 0, 6, comparator)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 0, 8, secondArray, 0, 6, comparator)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, -5, 0, comparator)); + assertThrows(ArrayIndexOutOfBoundsException.class, () -> Arrays.mismatch(firstArray, 2, 3, secondArray, 11, 12, comparator)); + } + +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 2152b90bcb..bf5b90cd32 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -73,6 +73,7 @@ core-java-arrays-multidimensional core-java-arrays-convert core-java-arrays-operations-basic + core-java-arrays-operations-basic-2 core-java-arrays-operations-advanced core-java-arrays-operations-advanced-2 core-java-booleans From 80f0c86aa3da74b8e7a473b5ea12246586952761 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Mon, 23 Oct 2023 05:12:19 +0300 Subject: [PATCH 210/831] This commit is related to the article BAEL-7089 (#15037) This commit aims to add a test class named "RemoveQueueElementsUnitTest" that provides code snippets for removing elements from a queue. --- .../RemoveQueueElementsUnitTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java new file mode 100644 index 0000000000..66cfade866 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.removequeueelements; + +import org.junit.Test; + +import java.util.LinkedList; +import java.util.Queue; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RemoveQueueElementsUnitTest { + @Test + public void givenQueueWithEvenAndOddNumbers_whenRemovingEvenNumbers_thenOddNumbersRemain() { + Queue queue = new LinkedList<>(); + Queue evenElementsQueue = new LinkedList<>(); + queue.add(1); + queue.add(2); + queue.add(3); + queue.add(4); + queue.add(5); + + while (queue.peek() != null) { + int element = queue.remove(); + if (element % 2 != 0) { + evenElementsQueue.add(element); + } + } + + assertEquals(3, evenElementsQueue.size()); + assertTrue(evenElementsQueue.contains(1)); + assertTrue(evenElementsQueue.contains(3)); + assertTrue(evenElementsQueue.contains(5)); + } + + @Test + public void givenStringQueue_whenRemovingStringsThatStartWithA_thenStringElementsRemain() { + Queue queue = new LinkedList<>(); + Queue stringElementsQueue = new LinkedList<>(); + queue.add("Apple"); + queue.add("Banana"); + queue.add("Orange"); + queue.add("Grape"); + queue.add("Mango"); + + + while (queue.peek() != null) { + String element = queue.remove(); + if (!element.startsWith("A")) { + stringElementsQueue.add(element); + } + } + + assertEquals(4, stringElementsQueue.size()); + assertTrue(stringElementsQueue.contains("Banana")); + assertTrue(stringElementsQueue.contains("Orange")); + assertTrue(stringElementsQueue.contains("Grape")); + assertTrue(stringElementsQueue.contains("Mango")); + } + +} From 7392b003f1cee2c312f29a17d1f46cb86aa0bcd9 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Mon, 23 Oct 2023 14:33:05 +0530 Subject: [PATCH 211/831] Adding sourcecode for reference in the article tracked under BAEL-6970. --- libraries-llms/README.md | 6 ++ libraries-llms/pom.xml | 43 ++++++++ libraries-llms/src/main/resources/logback.xml | 17 ++++ .../langchain/ChainWithDocumentLiveTests.java | 98 +++++++++++++++++++ .../langchain/ChatWithDocumentLiveTests.java | 80 +++++++++++++++ .../langchain/ChatWithMemoryLiveTests.java | 45 +++++++++ .../com/baeldung/langchain/Constants.java | 7 ++ .../langchain/PromptTemplatesLiveTests.java | 42 ++++++++ .../langchain/ServiceWithToolsLiveTests.java | 52 ++++++++++ .../example-files/simpson's_adventures.txt | 28 ++++++ pom.xml | 2 + 11 files changed, 420 insertions(+) create mode 100644 libraries-llms/README.md create mode 100644 libraries-llms/pom.xml create mode 100644 libraries-llms/src/main/resources/logback.xml create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/Constants.java create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java create mode 100644 libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java create mode 100644 libraries-llms/src/test/resources/example-files/simpson's_adventures.txt diff --git a/libraries-llms/README.md b/libraries-llms/README.md new file mode 100644 index 0000000000..2e250d42d6 --- /dev/null +++ b/libraries-llms/README.md @@ -0,0 +1,6 @@ +## Language Model Integration Libraries + +This module contains articles about libraries for language model integration in Java. + +### Relevant articles +- [Introduction to LangChain](https://www.baeldung.com/langchain) \ No newline at end of file diff --git a/libraries-llms/pom.xml b/libraries-llms/pom.xml new file mode 100644 index 0000000000..3d5ed6830e --- /dev/null +++ b/libraries-llms/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + libraries-llms + libraries-llms + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + dev.langchain4j + langchain4j + ${langchain4j.version} + + + dev.langchain4j + langchain4j-embeddings + ${langchain4j.version} + + + dev.langchain4j + langchain4j-open-ai + ${langchain4j.version} + + + dev.langchain4j + langchain4j-embeddings-all-minilm-l6-v2 + ${langchain4j.version} + + + + + 0.23.0 + + + \ No newline at end of file diff --git a/libraries-llms/src/main/resources/logback.xml b/libraries-llms/src/main/resources/logback.xml new file mode 100644 index 0000000000..23c5605a05 --- /dev/null +++ b/libraries-llms/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - + %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java new file mode 100644 index 0000000000..4ab5eaa68d --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java @@ -0,0 +1,98 @@ +package com.baeldung.langchain; + +import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument; +import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; +import static java.time.Duration.ofSeconds; +import static java.util.stream.Collectors.joining; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Test; + +import dev.langchain4j.data.document.Document; +import dev.langchain4j.data.document.DocumentSplitter; +import dev.langchain4j.data.document.splitter.DocumentSplitters; +import dev.langchain4j.data.embedding.Embedding; +import dev.langchain4j.data.message.AiMessage; +import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel; +import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.model.input.Prompt; +import dev.langchain4j.model.input.PromptTemplate; +import dev.langchain4j.model.openai.OpenAiChatModel; +import dev.langchain4j.model.openai.OpenAiTokenizer; +import dev.langchain4j.store.embedding.EmbeddingMatch; +import dev.langchain4j.store.embedding.EmbeddingStore; +import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; + +public class ChainWithDocumentLiveTests { + + @Test + public void givenChainWithDocument_whenPrompted_thenValidResponse() { + + Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); + DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO)); + List segments = splitter.split(document); + + EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); + List embeddings = embeddingModel.embedAll(segments) + .content(); + EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); + embeddingStore.addAll(embeddings, segments); + + String question = "Who is Simpson?"; + Embedding questionEmbedding = embeddingModel.embed(question) + .content(); + int maxResults = 3; + double minScore = 0.7; + List> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore); + + PromptTemplate promptTemplate = PromptTemplate.from("Answer the following question to the best of your ability:\n" + "\n" + "Question:\n" + "{{question}}\n" + "\n" + "Base your answer on the following information:\n" + "{{information}}"); + + String information = relevantEmbeddings.stream() + .map(match -> match.embedded() + .text()) + .collect(joining("\n\n")); + + Map variables = new HashMap<>(); + variables.put("question", question); + variables.put("information", information); + + Prompt prompt = promptTemplate.apply(variables); + ChatLanguageModel chatModel = OpenAiChatModel.builder() + .apiKey(Constants.OPEN_API_KEY) + .timeout(ofSeconds(60)) + .build(); + AiMessage aiMessage = chatModel.generate(prompt.toUserMessage()) + .content(); + + Logger.getGlobal() + .info(aiMessage.text()); + Assert.assertNotNull(aiMessage.text()); + + } + + private static Path toPath(String fileName) { + try { + URL fileUrl = new File(fileName).toURI() + .toURL(); + System.out.println(new File(fileName).toURI() + .toURL()); + return Paths.get(fileUrl.toURI()); + } catch (URISyntaxException | MalformedURLException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java new file mode 100644 index 0000000000..e75465e5b7 --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java @@ -0,0 +1,80 @@ +package com.baeldung.langchain; + +import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument; +import static java.time.Duration.ofSeconds; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Test; + +import dev.langchain4j.chain.ConversationalRetrievalChain; +import dev.langchain4j.data.document.Document; +import dev.langchain4j.data.document.splitter.DocumentSplitters; +import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel; +import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.model.openai.OpenAiChatModel; +import dev.langchain4j.retriever.EmbeddingStoreRetriever; +import dev.langchain4j.store.embedding.EmbeddingStore; +import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; +import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; + +public class ChatWithDocumentLiveTests { + + @Test + public void givenDocument_whenPrompted_thenValidResponse() { + + EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); + + EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); + + EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() + .documentSplitter(DocumentSplitters.recursive(500, 0)) + .embeddingModel(embeddingModel) + .embeddingStore(embeddingStore) + .build(); + + Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); + ingestor.ingest(document); + + ChatLanguageModel chatModel = OpenAiChatModel.builder() + .apiKey(Constants.OPEN_API_KEY) + .timeout(ofSeconds(60)) + .build(); + + ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder() + .chatLanguageModel(chatModel) + .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)) + // .chatMemory() // you can override default chat memory + // .promptTemplate() // you can override default prompt template + .build(); + + String answer = chain.execute("Who is Simpson?"); + + Logger.getGlobal() + .info(answer); + Assert.assertNotNull(answer); + + } + + private static Path toPath(String fileName) { + try { + URL fileUrl = new File(fileName).toURI() + .toURL(); + System.out.println(new File(fileName).toURI() + .toURL()); + return Paths.get(fileUrl.toURI()); + } catch (URISyntaxException | MalformedURLException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java new file mode 100644 index 0000000000..4395c52274 --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java @@ -0,0 +1,45 @@ +package com.baeldung.langchain; + +import dev.langchain4j.data.message.AiMessage; +import dev.langchain4j.memory.ChatMemory; +import dev.langchain4j.memory.chat.TokenWindowChatMemory; +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.openai.OpenAiChatModel; +import dev.langchain4j.model.openai.OpenAiTokenizer; + +import static dev.langchain4j.data.message.UserMessage.userMessage; +import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; + +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Test; + +public class ChatWithMemoryLiveTests { + + @Test + public void givenMemory_whenPrompted_thenValidResponse() { + + ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY); + ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO)); + + chatMemory.add(userMessage("Hello, my name is Kumar")); + AiMessage answer = model.generate(chatMemory.messages()) + .content(); + Logger.getGlobal() + .info(answer.text()); + Assert.assertNotNull(answer.text()); + chatMemory.add(answer); + + chatMemory.add(userMessage("What is my name?")); + AiMessage answerWithName = model.generate(chatMemory.messages()) + .content(); + Logger.getGlobal() + .info(answerWithName.text()); + Assert.assertTrue(answerWithName.text() + .contains("Kumar")); + chatMemory.add(answerWithName); + + } + +} diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java new file mode 100644 index 0000000000..15645ce68e --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java @@ -0,0 +1,7 @@ +package com.baeldung.langchain; + +public class Constants { + + public static String OPEN_API_KEY = "demo"; + +} diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java new file mode 100644 index 0000000000..c485b9cdf6 --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java @@ -0,0 +1,42 @@ +package com.baeldung.langchain; + +import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + +import org.junit.Test; + +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.input.Prompt; +import dev.langchain4j.model.input.PromptTemplate; +import dev.langchain4j.model.openai.OpenAiChatModel; + +import org.junit.Assert; + +public class PromptTemplatesLiveTests { + + @Test + public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() { + + PromptTemplate promptTemplate = PromptTemplate.from("Tell me a {{adjective}} joke about {{content}}.."); + Map variables = new HashMap<>(); + variables.put("adjective", "funny"); + variables.put("content", "humans"); + Prompt prompt = promptTemplate.apply(variables); + + ChatLanguageModel model = OpenAiChatModel.builder() + .apiKey(Constants.OPEN_API_KEY) + .modelName(GPT_3_5_TURBO) + .temperature(0.3) + .build(); + + String response = model.generate(prompt.text()); + Logger.getGlobal() + .info(response); + Assert.assertNotNull(response); + + } + +} diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java new file mode 100644 index 0000000000..1e4b356334 --- /dev/null +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java @@ -0,0 +1,52 @@ +package com.baeldung.langchain; + +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Test; + +import dev.langchain4j.agent.tool.Tool; +import dev.langchain4j.memory.chat.MessageWindowChatMemory; +import dev.langchain4j.model.openai.OpenAiChatModel; +import dev.langchain4j.service.AiServices; + +public class ServiceWithToolsLiveTests { + + static class Calculator { + + @Tool("Calculates the length of a string") + int stringLength(String s) { + return s.length(); + } + + @Tool("Calculates the sum of two numbers") + int add(int a, int b) { + return a + b; + } + + } + + interface Assistant { + + String chat(String userMessage); + } + + @Test + public void givenServiceWithTools_whenPrompted_thenValidResponse() { + + Assistant assistant = AiServices.builder(Assistant.class) + .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY)) + .tools(new Calculator()) + .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) + .build(); + + String question = "What is the sum of the numbers of letters in the words \"language\" and \"model\"?"; + String answer = assistant.chat(question); + + Logger.getGlobal() + .info(answer); + Assert.assertNotNull(answer); + + } + +} diff --git a/libraries-llms/src/test/resources/example-files/simpson's_adventures.txt b/libraries-llms/src/test/resources/example-files/simpson's_adventures.txt new file mode 100644 index 0000000000..ae6de80be0 --- /dev/null +++ b/libraries-llms/src/test/resources/example-files/simpson's_adventures.txt @@ -0,0 +1,28 @@ +Once upon a time in the town of VeggieVille, there lived a cheerful carrot named Simpson. +Simpson was a radiant carrot, always beaming with joy and positivity. +His vibrant orange skin and lush green top were a sight to behold, but it was his infectious laughter and warm personality that really set him apart. + +Simpson had a diverse group of friends, each a vegetable with their own unique characteristics. +There was Bella the blushing beetroot, always ready with a riddle or two; Timmy the timid tomato, a gentle soul with a heart of gold; and Percy the prankster potato, whose jokes always brought a smile to everyone's faces. +Despite their differences, they shared a close bond, their friendship as robust as their natural goodness. + +Their lives were filled with delightful adventures, from playing hide-and-seek amidst the leafy lettuce to swimming in the dewy droplets that pooled on the cabbage leaves. +Their favorite place, though, was the sunlit corner of the vegetable patch, where they would bask in the warmth of the sun, share stories, and have hearty laughs. + +One day, a bunch of pesky caterpillars invaded VeggieVille. +The vegetables were terrified, fearing they would be nibbled to nothingness. +But Simpson, with his usual sunny disposition, had an idea. +He proposed they host a grand feast for the caterpillars, with the juiciest leaves from the outskirts of the town. +Simpson's optimism was contagious, and his friends eagerly joined in to prepare the feast. + +When the caterpillars arrived, they were pleasantly surprised. +They enjoyed the feast and were so impressed with the vegetables' hospitality that they promised not to trouble VeggieVille again. +In return, they agreed to help pollinate the flowers, contributing to a more lush and vibrant VeggieVille. + +Simpson's idea had saved the day, but he humbly attributed the success to their teamwork and friendship. +They celebrated their victory with a grand party, filled with laughter, dance, and merry games. +That night, under the twinkling stars, they made a pact to always stand by each other, come what may. + +From then on, the story of the happy carrot and his friends spread far and wide, a tale of friendship, unity, and positivity. +Simpson, Bella, Timmy, and Percy continued to live their joyful lives, their laughter echoing through VeggieVille. +And so, the tale of the happy carrot and his friends serves as a reminder that no matter the challenge, with optimism, teamwork, and a bit of creativity, anything is possible. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3f4da4bdb0..a391a1c774 100644 --- a/pom.xml +++ b/pom.xml @@ -936,6 +936,7 @@ spring-di-4 spring-kafka-2 + libraries-llms @@ -1223,6 +1224,7 @@ spring-di-4 spring-kafka-2 + libraries-llms From 9796fd51979d6f002451db45d36941b42dd988a2 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Mon, 23 Oct 2023 16:04:27 +0530 Subject: [PATCH 212/831] Adding sourcecode for reference in the article tracked under BAEL-6970. --- ...nWithDocumentLiveTests.java => ChainWithDocumentLiveTest.java} | 0 ...atWithDocumentLiveTests.java => ChatWithDocumentLiveTest.java} | 0 .../{ChatWithMemoryLiveTests.java => ChatWithMemoryLiveTest.java} | 0 ...PromptTemplatesLiveTests.java => PromptTemplatesLiveTest.java} | 0 ...rviceWithToolsLiveTests.java => ServiceWithToolsLiveTest.java} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename libraries-llms/src/test/java/com/baeldung/langchain/{ChainWithDocumentLiveTests.java => ChainWithDocumentLiveTest.java} (100%) rename libraries-llms/src/test/java/com/baeldung/langchain/{ChatWithDocumentLiveTests.java => ChatWithDocumentLiveTest.java} (100%) rename libraries-llms/src/test/java/com/baeldung/langchain/{ChatWithMemoryLiveTests.java => ChatWithMemoryLiveTest.java} (100%) rename libraries-llms/src/test/java/com/baeldung/langchain/{PromptTemplatesLiveTests.java => PromptTemplatesLiveTest.java} (100%) rename libraries-llms/src/test/java/com/baeldung/langchain/{ServiceWithToolsLiveTests.java => ServiceWithToolsLiveTest.java} (100%) diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java similarity index 100% rename from libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTests.java rename to libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java similarity index 100% rename from libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTests.java rename to libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java similarity index 100% rename from libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTests.java rename to libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java similarity index 100% rename from libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTests.java rename to libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java similarity index 100% rename from libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTests.java rename to libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java From c36a6cc5a4f70ca32cd6397f45ad83a890248deb Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Mon, 23 Oct 2023 16:05:03 +0530 Subject: [PATCH 213/831] Changed the name of tests from LiveTests to LiveTest --- .../java/com/baeldung/langchain/ChainWithDocumentLiveTest.java | 2 +- .../java/com/baeldung/langchain/ChatWithDocumentLiveTest.java | 2 +- .../java/com/baeldung/langchain/ChatWithMemoryLiveTest.java | 2 +- .../java/com/baeldung/langchain/PromptTemplatesLiveTest.java | 2 +- .../java/com/baeldung/langchain/ServiceWithToolsLiveTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java index 4ab5eaa68d..b1db486d84 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java @@ -36,7 +36,7 @@ import dev.langchain4j.store.embedding.EmbeddingMatch; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; -public class ChainWithDocumentLiveTests { +public class ChainWithDocumentLiveTest { @Test public void givenChainWithDocument_whenPrompted_thenValidResponse() { diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java index e75465e5b7..643c56520e 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java @@ -27,7 +27,7 @@ import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; -public class ChatWithDocumentLiveTests { +public class ChatWithDocumentLiveTest { @Test public void givenDocument_whenPrompted_thenValidResponse() { diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java index 4395c52274..5e0057d23c 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java @@ -15,7 +15,7 @@ import java.util.logging.Logger; import org.junit.Assert; import org.junit.Test; -public class ChatWithMemoryLiveTests { +public class ChatWithMemoryLiveTest { @Test public void givenMemory_whenPrompted_thenValidResponse() { diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java index c485b9cdf6..5f155d3dba 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java @@ -15,7 +15,7 @@ import dev.langchain4j.model.openai.OpenAiChatModel; import org.junit.Assert; -public class PromptTemplatesLiveTests { +public class PromptTemplatesLiveTest { @Test public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() { diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java index 1e4b356334..024c1523e8 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java @@ -10,7 +10,7 @@ import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.service.AiServices; -public class ServiceWithToolsLiveTests { +public class ServiceWithToolsLiveTest { static class Calculator { From 199df44c7f2978ed766273dd2bb17fce66ad0531 Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Mon, 23 Oct 2023 16:11:03 +0530 Subject: [PATCH 214/831] JAVA-18764: Changes made for updating the code --- .../cassecuredapp/CasSecuredApplication.java | 9 ++++++--- .../service/CasUserDetailsService.java | 13 +++++++------ .../cassecuredapp/user/{User.java => CasUser.java} | 2 +- .../baeldung/cassecuredapp/user/UserRepository.java | 6 ++---- .../src/main/resources/application.properties | 10 +++++----- 5 files changed, 21 insertions(+), 19 deletions(-) rename security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/{User.java => CasUser.java} (96%) diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java index 84bbd2ace4..f78d7a45d5 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredApplication.java @@ -12,6 +12,8 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.cas.ServiceProperties; import org.springframework.security.cas.authentication.CasAuthenticationProvider; import org.springframework.security.cas.web.CasAuthenticationFilter; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.User; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; @@ -62,10 +64,11 @@ public class CasSecuredApplication { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties); provider.setTicketValidator(ticketValidator); - /* provider.setUserDetailsService( + provider.setUserDetailsService( s -> new User("casuser", "Mellon", true, true, true, true, - AuthorityUtils.createAuthorityList("ROLE_ADMIN")));*/ - provider.setUserDetailsService(getUser()); + AuthorityUtils.createAuthorityList("ROLE_ADMIN"))); + //For Authentication with a Database-backed UserDetailsService + //provider.setUserDetailsService(getUser()); provider.setKey("CAS_PROVIDER_LOCALHOST_8900"); return provider; } diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java index ac4fef1ff0..801f5726b7 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/service/CasUserDetailsService.java @@ -4,11 +4,12 @@ import java.util.Collections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import com.baeldung.cassecuredapp.user.User; +import com.baeldung.cassecuredapp.user.CasUser; import com.baeldung.cassecuredapp.user.UserRepository; public class CasUserDetailsService implements UserDetailsService { @@ -19,18 +20,18 @@ public class CasUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // Get the user from the database. - User user = getUserFromDatabase(username); + CasUser casUser = getUserFromDatabase(username); // Create a UserDetails object. - UserDetails userDetails = new org.springframework.security.core.userdetails.User( - user.getEmail(), - user.getPassword(), + UserDetails userDetails = new User( + casUser.getEmail(), + casUser.getPassword(), Collections.singletonList(new SimpleGrantedAuthority("ROLE_ADMIN"))); return userDetails; } - private User getUserFromDatabase(String username) { + private CasUser getUserFromDatabase(String username) { return userRepository.findByEmail(username); } } diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/CasUser.java similarity index 96% rename from security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java rename to security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/CasUser.java index 1dddc11458..2bf96d0994 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/User.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/CasUser.java @@ -5,7 +5,7 @@ import javax.persistence.Entity; import javax.persistence.Id; @Entity -public class User { +public class CasUser { @Id private Long id; diff --git a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java index 0481fabb06..623ccf2e38 100644 --- a/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java +++ b/security-modules/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/user/UserRepository.java @@ -4,11 +4,9 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import com.baeldung.cassecuredapp.user.User; - @Repository -public interface UserRepository extends CrudRepository { +public interface UserRepository extends CrudRepository { - User findByEmail(@Param("email") String email); + CasUser findByEmail(@Param("email") String email); } diff --git a/security-modules/cas/cas-secured-app/src/main/resources/application.properties b/security-modules/cas/cas-secured-app/src/main/resources/application.properties index fa13527982..5c93c67ff1 100644 --- a/security-modules/cas/cas-secured-app/src/main/resources/application.properties +++ b/security-modules/cas/cas-secured-app/src/main/resources/application.properties @@ -1,8 +1,8 @@ server.port=8900 spring.freemarker.suffix=.ftl -spring.jpa.generate-ddl=false -spring.datasource.url= jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password=root1234 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file +#spring.jpa.generate-ddl=false +#spring.datasource.url= jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC +#spring.datasource.username=root +#spring.datasource.password=root +#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file From d2cd902965cc8968628185b57f5f31e0de94724c Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Mon, 23 Oct 2023 16:12:35 +0530 Subject: [PATCH 215/831] JAVA-18764: Update article "CAS SSO with Spring Security" --- .../src/main/resources/application.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/security-modules/cas/cas-server/src/main/resources/application.yml b/security-modules/cas/cas-server/src/main/resources/application.yml index 0fd72c539d..a49e86dd09 100644 --- a/security-modules/cas/cas-server/src/main/resources/application.yml +++ b/security-modules/cas/cas-server/src/main/resources/application.yml @@ -8,19 +8,19 @@ server: spring: main: allow-bean-definition-overriding: true -cas: - authn: - accept: - users: - jdbc: - query[0]: - sql: SELECT * FROM users WHERE email = ? - url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC - dialect: org.hibernate.dialect.MySQLDialect - user: root - password: root1234 - ddlAuto: none - driverClass: com.mysql.cj.jdbc.Driver - fieldPassword: password - passwordEncoder: - type: NONE +#cas: +# authn: +# accept: +# users: +# jdbc: +# query[0]: +# sql: SELECT * FROM users WHERE email = ? +# url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC +# dialect: org.hibernate.dialect.MySQLDialect +# user: root +# password: root +# ddlAuto: none +# driverClass: com.mysql.cj.jdbc.Driver +# fieldPassword: password +# passwordEncoder: +# type: NONE From 210eaf2c0b77fb1bd366cbd2040d5ac0376d81de Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Mon, 23 Oct 2023 18:07:43 +0200 Subject: [PATCH 216/831] BAEL-7001: fixed formatting --- .../retry/RetryCompletableFuture.java | 100 +++++----- .../retry/RetryCompletableFutureUnitTest.java | 176 +++++++++--------- 2 files changed, 139 insertions(+), 137 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java index 41f1309311..a3df6b3624 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java @@ -5,59 +5,59 @@ import java.util.function.Function; import java.util.function.Supplier; public class RetryCompletableFuture { - public static CompletableFuture retryTask(Supplier supplier, int maxRetries) { - Supplier retryableSupplier = retryFunction(supplier, maxRetries); - return CompletableFuture.supplyAsync(retryableSupplier); - } + public static CompletableFuture retryTask(Supplier supplier, int maxRetries) { + Supplier retryableSupplier = retryFunction(supplier, maxRetries); + return CompletableFuture.supplyAsync(retryableSupplier); + } - static Supplier retryFunction(Supplier supplier, int maxRetries) { - return () -> { - int retries = 0; - while (retries < maxRetries) { - try { - return supplier.get(); - } catch (Exception e) { - retries++; - } - } - throw new IllegalStateException(String.format("Task failed after %s attempts", maxRetries)); - }; - } + static Supplier retryFunction(Supplier supplier, int maxRetries) { + return () -> { + int retries = 0; + while (retries < maxRetries) { + try { + return supplier.get(); + } catch (Exception e) { + retries++; + } + } + throw new IllegalStateException(String.format("Task failed after %s attempts", maxRetries)); + }; + } - public static CompletableFuture retryUnsafe(Supplier supplier, int maxRetries) { - CompletableFuture cf = CompletableFuture.supplyAsync(supplier); - sleep(100l); - for (int i = 0; i < maxRetries; i++) { - cf = cf.exceptionally(__ -> supplier.get()); - } - return cf; - } + public static CompletableFuture retryUnsafe(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100l); + for (int i = 0; i < maxRetries; i++) { + cf = cf.exceptionally(__ -> supplier.get()); + } + return cf; + } - public static CompletableFuture retryNesting(Supplier supplier, int maxRetries) { - CompletableFuture cf = CompletableFuture.supplyAsync(supplier); - sleep(100); - for (int i = 0; i < maxRetries; i++) { - cf = cf.thenApply(CompletableFuture::completedFuture) - .exceptionally(__ -> CompletableFuture.supplyAsync(supplier)) - .thenCompose(Function.identity()); - } - return cf; - } + public static CompletableFuture retryNesting(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100); + for (int i = 0; i < maxRetries; i++) { + cf = cf.thenApply(CompletableFuture::completedFuture) + .exceptionally(__ -> CompletableFuture.supplyAsync(supplier)) + .thenCompose(Function.identity()); + } + return cf; + } - public static CompletableFuture retryExceptionallyAsync(Supplier supplier, int maxRetries) { - CompletableFuture cf = CompletableFuture.supplyAsync(supplier); - sleep(100); - for (int i = 0; i < maxRetries; i++) { - cf = cf.exceptionallyAsync(__ -> supplier.get()); - } - return cf; - } + public static CompletableFuture retryExceptionallyAsync(Supplier supplier, int maxRetries) { + CompletableFuture cf = CompletableFuture.supplyAsync(supplier); + sleep(100); + for (int i = 0; i < maxRetries; i++) { + cf = cf.exceptionallyAsync(__ -> supplier.get()); + } + return cf; + } - private static void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } + private static void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } } diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java index b48039d4a6..ce847fe751 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java @@ -1,125 +1,127 @@ package com.baeldung.concurrent.completablefuture.retry; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.retryExceptionallyAsync; +import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.retryNesting; +import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.retryTask; +import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.retryUnsafe; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; -import static com.baeldung.concurrent.completablefuture.retry.RetryCompletableFuture.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; class RetryCompletableFutureUnitTest { - private AtomicInteger retriesCounter = new AtomicInteger(0); + private AtomicInteger retriesCounter = new AtomicInteger(0); - @BeforeEach - void beforeEach() { - retriesCounter.set(0); - } + @BeforeEach + void beforeEach() { + retriesCounter.set(0); + } - @Test - void whenRetryingTask_thenReturnsCorrectlyAfterFourInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingTask_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryTask(codeToRun, 10); + CompletableFuture result = retryTask(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); - } + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } - @Test - void whenRetryingTask_thenThrowsExceptionAfterThreeInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingTask_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryTask(codeToRun, 3); + CompletableFuture result = retryTask(codeToRun, 3); - assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) - .hasMessageContaining("IllegalStateException: Task failed after 3 attempts"); - } + assertThatThrownBy(result::join).isInstanceOf(CompletionException.class) + .hasMessageContaining("IllegalStateException: Task failed after 3 attempts"); + } - @Test - void whenRetryingExceptionally_thenReturnsCorrectlyAfterFourInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingExceptionally_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryUnsafe(codeToRun, 10); + CompletableFuture result = retryUnsafe(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); - } + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } - @Test - void whenRetryingExceptionally_thenThrowsExceptionAfterThreeInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingExceptionally_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryUnsafe(codeToRun, 3); + CompletableFuture result = retryUnsafe(codeToRun, 3); - assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) - .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); - } + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } - @Test - void whenRetryingExceptionallyAsync_thenReturnsCorrectlyAfterFourInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingExceptionallyAsync_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryExceptionallyAsync(codeToRun, 10); + CompletableFuture result = retryExceptionallyAsync(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); - } + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } - @Test - void whenRetryingExceptionallyAsync_thenThrowsExceptionAfterThreeInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingExceptionallyAsync_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryExceptionallyAsync(codeToRun, 3); + CompletableFuture result = retryExceptionallyAsync(codeToRun, 3); - assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) - .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); - } + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } - @Test - void whenRetryingNesting_thenReturnsCorrectlyAfterFourInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingNesting_thenReturnsCorrectlyAfterFourInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryNesting(codeToRun, 10); + CompletableFuture result = retryNesting(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); - } + assertThat(result.join()) + .isEqualTo(100); + assertThat(retriesCounter) + .hasValue(4); + } - @Test - void whenRetryingNesting_thenThrowsExceptionAfterThreeInvocations() { - Supplier codeToRun = () -> failFourTimesThenReturn(100); + @Test + void whenRetryingNesting_thenThrowsExceptionAfterThreeInvocations() { + Supplier codeToRun = () -> failFourTimesThenReturn(100); - CompletableFuture result = retryNesting(codeToRun, 3); + CompletableFuture result = retryNesting(codeToRun, 3); - assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) - .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); - } + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + } - int failFourTimesThenReturn(int returnValue) { - int retryNr = retriesCounter.get(); - System.out.println(String.format("invocation: %s, thread: %s", retryNr, Thread.currentThread().getName())); - if (retryNr < 4) { - retriesCounter.set(retryNr + 1); - throw new RuntimeException(String.format("task failed for %s time(s)", retryNr)); - } - return returnValue; - } + int failFourTimesThenReturn(int returnValue) { + int retryNr = retriesCounter.get(); + System.out.println(String.format("invocation: %s, thread: %s", retryNr, Thread.currentThread().getName())); + if (retryNr < 4) { + retriesCounter.set(retryNr + 1); + throw new RuntimeException(String.format("task failed for %s time(s)", retryNr)); + } + return returnValue; + } } From 5b4fc0d6f3753e8855d44da343dfba749118d123 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Mon, 23 Oct 2023 18:13:35 +0200 Subject: [PATCH 217/831] BAEL-7001: small fix --- .../retry/RetryCompletableFutureUnitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java index ce847fe751..7f1ea41f92 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java @@ -41,7 +41,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryTask(codeToRun, 3); - assertThatThrownBy(result::join).isInstanceOf(CompletionException.class) + assertThatThrownBy(result::join) + .isInstanceOf(CompletionException.class) .hasMessageContaining("IllegalStateException: Task failed after 3 attempts"); } From 9756cb1d102271b8a71d2efa217108dc3d6d34bf Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 23 Oct 2023 23:44:18 +0530 Subject: [PATCH 218/831] Add UnicodeLetterChecker to check if String contains Unicode --- .../unicode/UnicodeLetterChecker.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java new file mode 100644 index 0000000000..df561c88ea --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java @@ -0,0 +1,27 @@ +package com.baeldung.unicode; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; + +public class UnicodeLetterChecker { + public boolean characterClassCheck(String input) { + for (char c : input.toCharArray()) { + if (!Character.isLetter(c)) { + return false; + } + } + return true; + } + public boolean regexCheck(String input) { + Pattern pattern = Pattern.compile("^\\p{L}+$"); + Matcher matcher = pattern.matcher(input); + return matcher.matches(); + } + public boolean isAlphaCheck(String input) { + return StringUtils.isAlpha(input); + } + public boolean StreamsCheck(String input){ + return input.codePoints().allMatch(Character::isLetter); + } +} From e99ce4da19dfa17e27999855c13ce9a1b0eabcb1 Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 23 Oct 2023 23:45:43 +0530 Subject: [PATCH 219/831] Add tests for UnicodeLetterChecker --- .../unicode/UnicodeLetterCheckerUnitTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/unicode/UnicodeLetterCheckerUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/unicode/UnicodeLetterCheckerUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/unicode/UnicodeLetterCheckerUnitTest.java new file mode 100644 index 0000000000..a7ed9e5db9 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/unicode/UnicodeLetterCheckerUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.unicode; + +import org.junit.Test; +import static org.junit.Assert.assertTrue; + +public class UnicodeLetterCheckerUnitTest { + @Test + public void givenString_whenUsingIsLetter_thenReturnTrue() { + UnicodeLetterChecker checker = new UnicodeLetterChecker(); + + boolean isUnicodeLetter = checker.characterClassCheck("HelloWorld"); + assertTrue(isUnicodeLetter); + } + + @Test + public void givenString_whenUsingRegex_thenReturnTrue() { + UnicodeLetterChecker checker = new UnicodeLetterChecker(); + + boolean isUnicodeLetter = checker.regexCheck("HelloWorld"); + assertTrue(isUnicodeLetter); + } + + @Test + public void givenString_whenUsingIsAlpha_thenReturnTrue() { + UnicodeLetterChecker checker = new UnicodeLetterChecker(); + + boolean isUnicodeLetter = checker.isAlphaCheck("HelloWorld"); + assertTrue(isUnicodeLetter); + } + + @Test + public void givenString_whenUsingStreams_thenReturnTrue() { + UnicodeLetterChecker checker = new UnicodeLetterChecker(); + + boolean isUnicodeLetter = checker.StreamsCheck("HelloWorld"); + assertTrue(isUnicodeLetter); + } +} From efdb3f65b3b98538daac7413171108759ceab231 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Mon, 23 Oct 2023 19:15:17 +0000 Subject: [PATCH 220/831] return first non null and non empty optional unit tests --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 37 ++++++ ...eturnFirstNonNullLazyEvaluateUnitTest.java | 69 +++++++++++ .../ReturnFirstNonNullUnitTest.java | 108 ++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java create mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java new file mode 100644 index 0000000000..439cae6235 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -0,0 +1,37 @@ +package returnfirstnonempty; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ReturnFirstNonEmptyOptionalUnitTest { + + private List> optionals; + + @Before + public void init() { + optionals = Arrays.asList( + Optional.empty(), + Optional.of(new Object()), + Optional.empty() + ); + } + + @Test + public void givenListOfOptionals_thenReturnFirstNonEmpty() { + Object object = optionals + .stream() + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); + + assertTrue(object != null); + assertEquals(optionals.get(1), object); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java new file mode 100644 index 0000000000..ae8ca09ea1 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -0,0 +1,69 @@ +package returnfirstnonull; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.apache.commons.lang3.ObjectUtils; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ReturnFirstNonNullLazyEvaluateUnitTest { + + private static Object METHOD_B_OBJECT = new Object(); + + private Object methodA() { return null; } + + private Object methodB() { return METHOD_B_OBJECT; } + + private Object methodC() { return null; } + + @Test + public void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { + Object object = methodA(); + if(object == null) + object = methodB(); + + if(object == null) + object = methodC(); + + assertTrue(object != null); + assertEquals(METHOD_B_OBJECT, object); + } + + @Test + public void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { + Optional object = Stream + .>of( + this::methodA, + this::methodB, + this::methodC) + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst(); + + assertTrue(object.isPresent()); + assertEquals(METHOD_B_OBJECT, object.get()); + } + + @Test + public void givenTwoObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + Object object1 = methodA(); + Object object = ObjectUtils.getIfNull(object1, this::methodB); + + assertTrue(object != null); + assertEquals(METHOD_B_OBJECT, object); + } + + @Test + public void givenChainOfMethods_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + Object object = ObjectUtils.getFirstNonNull(this::methodA, this::methodB, this::methodC); + + assertTrue(object != null); + assertEquals(METHOD_B_OBJECT, object); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java new file mode 100644 index 0000000000..ddf3a131da --- /dev/null +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -0,0 +1,108 @@ +package returnfirstnonull; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.apache.commons.lang3.ObjectUtils; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ReturnFirstNonNullUnitTest { + + private List objects; + + @Before + public void init() { + objects = Arrays.asList( + null, + new Object(), + new Object() + ); + } + + @Test + public void givenListOfObjects_whenIteratingWithForLoop_thenReturnFirstNonNull() { + Object object = null; + for(int i = 0; i < objects.size(); i++) { + if(objects.get(i) != null) { + object = objects.get(i); + break; + } + } + + assertTrue(object != null); + assertEquals(objects.get(1), object); + } + + @Test + public void givenListOfObjects_whenIteratingWithEnhancedForLoop_thenReturnFirstNonNull() { + Object object = null; + for(Object o: objects) { + if(o != null) { + object = o; + break; + } + } + + assertTrue(object != null); + assertEquals(objects.get(1), object); + } + + @Test + public void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { + Optional object = objects + .stream() + .filter(o -> o != null) + .findFirst(); + + assertTrue(object.isPresent()); + assertEquals(objects.get(1), object.get()); + } + + @Test + public void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { + Optional object = objects + .stream() + .filter(Objects::nonNull) + .findFirst(); + + assertTrue(object.isPresent()); + assertEquals(objects.get(1), object.get()); + } + + @Test + public void givenListOfObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + Object object = ObjectUtils.firstNonNull(objects.toArray()); + + assertTrue(object != null); + assertEquals(objects.get(1), object); + } + + @Test + public void givenTwoObjects_whenUsingGoogleGuava_thenReturnFirstNonNull() { + Object object1 = null; + Object object2 = new Object(); + Object object = MoreObjects.firstNonNull(object1, object2); + + assertTrue(object != null); + assertEquals(object2, object); + } + + @Test + public void givenListOfObjects_whenUsingGoogleGuava_thenReturnFirstNonNull() { + Object object = Iterables.find(objects, Predicates.notNull()); + + assertTrue(object != null); + assertEquals(objects.get(1), object); + } +} \ No newline at end of file From 46f3aac2995baaf5b466a7226fa7e60479dfb15c Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 24 Oct 2023 14:10:17 +0530 Subject: [PATCH 221/831] JAVA-26283 Improve module build time --- .../web/interceptor/SessionTimerInterceptorIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java b/spring-security-modules/spring-security-web-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java index 07bc22f184..873c28c6a2 100644 --- a/spring-security-modules/spring-security-web-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java +++ b/spring-security-modules/spring-security-web-mvc-custom/src/test/java/com/baeldung/web/interceptor/SessionTimerInterceptorIntegrationTest.java @@ -49,7 +49,7 @@ public class SessionTimerInterceptorIntegrationTest { .andReturn() .getRequest() .getSession(); - Thread.sleep(51000); + Thread.sleep(5000); mockMvc.perform(get("/auth/foos").session((MockHttpSession) session)) .andExpect(status().is2xxSuccessful()); } From 7dd0b413425ee5a2991ed8020a40a8bd70eeacdc Mon Sep 17 00:00:00 2001 From: Alvin Austria Date: Tue, 24 Oct 2023 10:48:34 +0200 Subject: [PATCH 222/831] JAVA-18813 : Update Creating a Fat Jar in Gradle (#15030) --- gradle-modules/gradle/gradle-fat-jar/build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gradle-modules/gradle/gradle-fat-jar/build.gradle b/gradle-modules/gradle/gradle-fat-jar/build.gradle index 6e2934194e..4c3d86d757 100644 --- a/gradle-modules/gradle/gradle-fat-jar/build.gradle +++ b/gradle-modules/gradle/gradle-fat-jar/build.gradle @@ -8,8 +8,10 @@ buildscript { } } -apply plugin: 'java' -apply plugin: 'com.github.johnrengelman.shadow' +plugins { + id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'java' +} repositories { mavenCentral() @@ -30,7 +32,7 @@ task customFatJar(type: Jar) { manifest { attributes 'Main-Class': 'com.baeldung.fatjar.Application' } - baseName = 'all-in-one-jar' + archiveBaseName = 'all-in-one-jar' duplicatesStrategy = DuplicatesStrategy.EXCLUDE from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } with jar From 2b7e938e090500d2a970afae1d55f5edf95045b3 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 24 Oct 2023 14:40:19 +0530 Subject: [PATCH 223/831] JAVA-26379 Change parent of spring-web-modules to parent-spring-5 --- spring-web-modules/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 9f03b83392..2be896ad83 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -10,8 +10,9 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 From 01bce216c4cfdfc4b04baf250d8dd11890367e8d Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:15:46 +0300 Subject: [PATCH 224/831] This PR is related to the article BAEL-6878 (#15057) * Update pom.xml This commit aims to add additional required dependencies: org.apache.xmlbeans xmlbeans 5.0.2 org.apache.logging.log4j log4j-core 2.12.4 * This commit is related to the article BAEL-6878 This commit aims to add the "log4j2.xml" file to the resources folder. * This commit is related to the article BAEL-6878 This commit aims to add a new test class named "XMLObjectToStringUnitTest" that suggests several approaches to convert XML objects to a Java string --- xml-2/pom.xml | 12 ++- xml-2/src/main/resources/log4j2.xml | 13 +++ .../xml2string/XMLObjectToStringUnitTest.java | 87 +++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 xml-2/src/main/resources/log4j2.xml create mode 100644 xml-2/src/test/java/com/baeldung/xml/xml2string/XMLObjectToStringUnitTest.java diff --git a/xml-2/pom.xml b/xml-2/pom.xml index 7d10f36042..0f94588ba0 100644 --- a/xml-2/pom.xml +++ b/xml-2/pom.xml @@ -46,6 +46,16 @@ underscore ${underscore.version} + + org.apache.xmlbeans + xmlbeans + 5.0.2 + + + org.apache.logging.log4j + log4j-core + 2.12.4 + @@ -74,4 +84,4 @@ 1.89 - \ No newline at end of file + diff --git a/xml-2/src/main/resources/log4j2.xml b/xml-2/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..f022ab633b --- /dev/null +++ b/xml-2/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/xml-2/src/test/java/com/baeldung/xml/xml2string/XMLObjectToStringUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/xml2string/XMLObjectToStringUnitTest.java new file mode 100644 index 0000000000..0afa3424f3 --- /dev/null +++ b/xml-2/src/test/java/com/baeldung/xml/xml2string/XMLObjectToStringUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.xml2string; + +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlObject; +import org.apache.xmlbeans.XmlOptions; +import org.junit.Test; +import org.junit.Before; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.StringWriter; + +import static org.junit.Assert.assertTrue; + +public class XMLObjectToStringUnitTest { + private Document document; + + @Before + public void setup() throws ParserConfigurationException { +// Create a DocumentBuilder + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + +// Create a new Document + document = builder.newDocument(); + +// Create the root element + Element rootElement = document.createElement("root"); + document.appendChild(rootElement); + +// Create child elements + Element childElement1 = document.createElement("child1"); + Element childElement2 = document.createElement("child2"); + +// Add text content to the child elements + childElement1.appendChild(document.createTextNode("This is child element 1")); + childElement2.appendChild(document.createTextNode("This is child element 2")); + +// Append child elements to the root element + rootElement.appendChild(childElement1); + rootElement.appendChild(childElement2); + } + + @Test + public void givenXMLDocument_whenUsingTransformer_thenConvertXMLToString() throws TransformerException { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + StringWriter stringWriter = new StringWriter(); + transformer.transform(new DOMSource(document), new StreamResult(stringWriter)); + String result = stringWriter.toString(); + + assertTrue(result.contains("")); + assertTrue(result.contains("This is child element 1")); + assertTrue(result.contains("This is child element 2")); + } + + @Test + public void givenXMLDocument_whenUsingXmlBeans_thenConvertXMLToString() { + try { + + XmlObject xmlObject = XmlObject.Factory.parse(document); + + XmlOptions options = new XmlOptions(); + options.setSavePrettyPrint(); + options.setUseDefaultNamespace(); + options.setSaveAggressiveNamespaces(); + + String xmlString = xmlObject.xmlText(options); + + xmlString = "" + xmlString; + + assertTrue(xmlString.contains("")); + assertTrue(xmlString.contains("This is child element 1")); + assertTrue(xmlString.contains("This is child element 2")); + } catch (XmlException e) { + e.printStackTrace(); + } + } +} From 03c9dce8cf0a141e8dfd705d03aaaef06579dd30 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Wed, 25 Oct 2023 10:40:32 +0530 Subject: [PATCH 225/831] Incorporated some review comments on the code. --- libraries-llms/src/main/resources/logback.xml | 17 ---- .../langchain/ChainWithDocumentLiveTest.java | 73 +++++++---------- .../langchain/ChatWithDocumentLiveTest.java | 78 ++++++++++++------- .../langchain/ChatWithMemoryLiveTest.java | 18 ++--- .../com/baeldung/langchain/Constants.java | 7 +- .../langchain/PromptTemplatesLiveTest.java | 10 ++- .../langchain/ServiceWithToolsLiveTest.java | 13 ++-- pom.xml | 4 +- 8 files changed, 110 insertions(+), 110 deletions(-) delete mode 100644 libraries-llms/src/main/resources/logback.xml diff --git a/libraries-llms/src/main/resources/logback.xml b/libraries-llms/src/main/resources/logback.xml deleted file mode 100644 index 23c5605a05..0000000000 --- a/libraries-llms/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - - %msg%n - - - - - - - - - - \ No newline at end of file diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java index b1db486d84..556f394866 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java @@ -1,9 +1,7 @@ package com.baeldung.langchain; import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument; -import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; import static java.time.Duration.ofSeconds; -import static java.util.stream.Collectors.joining; import java.io.File; import java.net.MalformedURLException; @@ -11,75 +9,64 @@ import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import dev.langchain4j.chain.ConversationalRetrievalChain; import dev.langchain4j.data.document.Document; -import dev.langchain4j.data.document.DocumentSplitter; import dev.langchain4j.data.document.splitter.DocumentSplitters; -import dev.langchain4j.data.embedding.Embedding; -import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.data.segment.TextSegment; +import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; -import dev.langchain4j.model.input.Prompt; import dev.langchain4j.model.input.PromptTemplate; import dev.langchain4j.model.openai.OpenAiChatModel; -import dev.langchain4j.model.openai.OpenAiTokenizer; -import dev.langchain4j.store.embedding.EmbeddingMatch; +import dev.langchain4j.retriever.EmbeddingStoreRetriever; import dev.langchain4j.store.embedding.EmbeddingStore; +import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; public class ChainWithDocumentLiveTest { + + Logger logger = LoggerFactory.getLogger(ChainWithDocumentLiveTest.class); @Test - public void givenChainWithDocument_whenPrompted_thenValidResponse() { - - Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); - DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO)); - List segments = splitter.split(document); + public void givenDocument_whenPrompted_thenValidResponse() { EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); - List embeddings = embeddingModel.embedAll(segments) - .content(); + EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); - embeddingStore.addAll(embeddings, segments); - String question = "Who is Simpson?"; - Embedding questionEmbedding = embeddingModel.embed(question) - .content(); - int maxResults = 3; - double minScore = 0.7; - List> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore); + EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() + .documentSplitter(DocumentSplitters.recursive(500, 0)) + .embeddingModel(embeddingModel) + .embeddingStore(embeddingStore) + .build(); - PromptTemplate promptTemplate = PromptTemplate.from("Answer the following question to the best of your ability:\n" + "\n" + "Question:\n" + "{{question}}\n" + "\n" + "Base your answer on the following information:\n" + "{{information}}"); + Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); + ingestor.ingest(document); - String information = relevantEmbeddings.stream() - .map(match -> match.embedded() - .text()) - .collect(joining("\n\n")); - - Map variables = new HashMap<>(); - variables.put("question", question); - variables.put("information", information); - - Prompt prompt = promptTemplate.apply(variables); ChatLanguageModel chatModel = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_API_KEY) + .apiKey(Constants.OPEN_AI_KEY) .timeout(ofSeconds(60)) .build(); - AiMessage aiMessage = chatModel.generate(prompt.toUserMessage()) - .content(); - Logger.getGlobal() - .info(aiMessage.text()); - Assert.assertNotNull(aiMessage.text()); + ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder() + .chatLanguageModel(chatModel) + .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)) + .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) + .promptTemplate(PromptTemplate + .from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}")) + .build(); + + String answer = chain.execute("Who is Simpson?"); + + logger.info(answer); + Assert.assertNotNull(answer); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java index 643c56520e..a7dc89afde 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java @@ -1,7 +1,9 @@ package com.baeldung.langchain; import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument; +import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; import static java.time.Duration.ofSeconds; +import static java.util.stream.Collectors.joining; import java.io.File; import java.net.MalformedURLException; @@ -9,59 +11,77 @@ import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.logging.Logger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import dev.langchain4j.chain.ConversationalRetrievalChain; import dev.langchain4j.data.document.Document; +import dev.langchain4j.data.document.DocumentSplitter; import dev.langchain4j.data.document.splitter.DocumentSplitters; +import dev.langchain4j.data.embedding.Embedding; +import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; +import dev.langchain4j.model.input.Prompt; +import dev.langchain4j.model.input.PromptTemplate; import dev.langchain4j.model.openai.OpenAiChatModel; -import dev.langchain4j.retriever.EmbeddingStoreRetriever; +import dev.langchain4j.model.openai.OpenAiTokenizer; +import dev.langchain4j.store.embedding.EmbeddingMatch; import dev.langchain4j.store.embedding.EmbeddingStore; -import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; public class ChatWithDocumentLiveTest { + + Logger logger = LoggerFactory.getLogger(ChatWithDocumentLiveTest.class); @Test - public void givenDocument_whenPrompted_thenValidResponse() { - - EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); - - EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); - - EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() - .documentSplitter(DocumentSplitters.recursive(500, 0)) - .embeddingModel(embeddingModel) - .embeddingStore(embeddingStore) - .build(); + public void givenChainWithDocument_whenPrompted_thenValidResponse() { Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); - ingestor.ingest(document); + DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO)); + List segments = splitter.split(document); + EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); + List embeddings = embeddingModel.embedAll(segments) + .content(); + EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); + embeddingStore.addAll(embeddings, segments); + + String question = "Who is Simpson?"; + Embedding questionEmbedding = embeddingModel.embed(question) + .content(); + int maxResults = 3; + double minScore = 0.7; + List> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore); + + PromptTemplate promptTemplate = PromptTemplate.from("Answer the following question to the best of your ability:\n" + "\n" + "Question:\n" + "{{question}}\n" + "\n" + "Base your answer on the following information:\n" + "{{information}}"); + + String information = relevantEmbeddings.stream() + .map(match -> match.embedded() + .text()) + .collect(joining("\n\n")); + + Map variables = new HashMap<>(); + variables.put("question", question); + variables.put("information", information); + + Prompt prompt = promptTemplate.apply(variables); ChatLanguageModel chatModel = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_API_KEY) + .apiKey(Constants.OPEN_AI_KEY) .timeout(ofSeconds(60)) .build(); + AiMessage aiMessage = chatModel.generate(prompt.toUserMessage()) + .content(); - ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder() - .chatLanguageModel(chatModel) - .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)) - // .chatMemory() // you can override default chat memory - // .promptTemplate() // you can override default prompt template - .build(); - - String answer = chain.execute("Who is Simpson?"); - - Logger.getGlobal() - .info(answer); - Assert.assertNotNull(answer); + logger.info(aiMessage.text()); + Assert.assertNotNull(aiMessage.text()); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java index 5e0057d23c..8f7dcca1cb 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java @@ -9,35 +9,35 @@ import dev.langchain4j.model.openai.OpenAiTokenizer; import static dev.langchain4j.data.message.UserMessage.userMessage; import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; - -import java.util.logging.Logger; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ChatWithMemoryLiveTest { + + Logger logger = LoggerFactory.getLogger(ChatWithMemoryLiveTest.class); @Test public void givenMemory_whenPrompted_thenValidResponse() { - ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY); + ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY); ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO)); chatMemory.add(userMessage("Hello, my name is Kumar")); AiMessage answer = model.generate(chatMemory.messages()) .content(); - Logger.getGlobal() - .info(answer.text()); + logger.info(answer.text()); Assert.assertNotNull(answer.text()); chatMemory.add(answer); chatMemory.add(userMessage("What is my name?")); AiMessage answerWithName = model.generate(chatMemory.messages()) .content(); - Logger.getGlobal() - .info(answerWithName.text()); - Assert.assertTrue(answerWithName.text() - .contains("Kumar")); + logger.info(answerWithName.text()); + assertThat(answerWithName.text().contains("Kumar")); chatMemory.add(answerWithName); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java index 15645ce68e..149858f351 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java @@ -2,6 +2,11 @@ package com.baeldung.langchain; public class Constants { - public static String OPEN_API_KEY = "demo"; + /** + * A limited access key for access to OpenAI language models can be generated by first + * registering for free at (https://platform.openai.com/signup) and then by navigating + * to "Create new secret key" page at (https://platform.openai.com/account/api-keys). + */ + public static String OPEN_AI_KEY = ""; } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java index 5f155d3dba..31698ee0c7 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java @@ -4,9 +4,10 @@ import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; import java.util.HashMap; import java.util.Map; -import java.util.logging.Logger; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.input.Prompt; @@ -16,6 +17,8 @@ import dev.langchain4j.model.openai.OpenAiChatModel; import org.junit.Assert; public class PromptTemplatesLiveTest { + + Logger logger = LoggerFactory.getLogger(PromptTemplatesLiveTest.class); @Test public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() { @@ -27,14 +30,13 @@ public class PromptTemplatesLiveTest { Prompt prompt = promptTemplate.apply(variables); ChatLanguageModel model = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_API_KEY) + .apiKey(Constants.OPEN_AI_KEY) .modelName(GPT_3_5_TURBO) .temperature(0.3) .build(); String response = model.generate(prompt.text()); - Logger.getGlobal() - .info(response); + logger.info(response); Assert.assertNotNull(response); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java index 024c1523e8..6a6144aa21 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java @@ -1,9 +1,11 @@ package com.baeldung.langchain; -import java.util.logging.Logger; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.Assert; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import dev.langchain4j.agent.tool.Tool; import dev.langchain4j.memory.chat.MessageWindowChatMemory; @@ -11,6 +13,8 @@ import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.service.AiServices; public class ServiceWithToolsLiveTest { + + Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class); static class Calculator { @@ -35,7 +39,7 @@ public class ServiceWithToolsLiveTest { public void givenServiceWithTools_whenPrompted_thenValidResponse() { Assistant assistant = AiServices.builder(Assistant.class) - .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_API_KEY)) + .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY)) .tools(new Calculator()) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build(); @@ -43,9 +47,8 @@ public class ServiceWithToolsLiveTest { String question = "What is the sum of the numbers of letters in the words \"language\" and \"model\"?"; String answer = assistant.chat(question); - Logger.getGlobal() - .info(answer); - Assert.assertNotNull(answer); + logger.info(answer); + assertThat(answer).contains("13"); } diff --git a/pom.xml b/pom.xml index a391a1c774..cc433f0946 100644 --- a/pom.xml +++ b/pom.xml @@ -936,7 +936,7 @@ spring-di-4 spring-kafka-2 - libraries-llms + libraries-llms @@ -1224,7 +1224,7 @@ spring-di-4 spring-kafka-2 - libraries-llms + libraries-llms From ba64b644124ea0d4dca06c891589a61aebe8c743 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:18:34 +0530 Subject: [PATCH 226/831] Update pom.xml fixed Formatting --- persistence-modules/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 867c12291a..7787e0bda8 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -105,7 +105,7 @@ spring-jpa spring-jpa-2 spring-jdbc - spring-jdbc-2 + spring-jdbc-2 spring-jooq spring-mybatis spring-persistence-simple From 90f25fc44970c1ce0103b1c20cb2cec1841ec8f9 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:31:26 +0530 Subject: [PATCH 227/831] BAEL-7135 renamed package --- .../JdbcClientDemoApplication.java | 4 ++-- .../{jdbcClient => jdbcclient}/dao/StudentDao.java | 8 ++++---- .../{jdbcClient => jdbcclient}/model/Student.java | 2 +- .../model/StudentResultExtractor.java | 2 +- .../model/StudentRowMapper.java | 2 +- .../application.properties | 0 .../drop_student.sql | 0 .../student.sql | 0 .../JdbcClientUnitTest.java | 12 ++++++------ 9 files changed, 15 insertions(+), 15 deletions(-) rename persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/{jdbcClient => jdbcclient}/JdbcClientDemoApplication.java (80%) rename persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/{jdbcClient => jdbcclient}/dao/StudentDao.java (95%) rename persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/{jdbcClient => jdbcclient}/model/Student.java (96%) rename persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/{jdbcClient => jdbcclient}/model/StudentResultExtractor.java (95%) rename persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/{jdbcClient => jdbcclient}/model/StudentRowMapper.java (94%) rename persistence-modules/spring-jdbc-2/src/main/resources/{com.baeldung.jdbcClient => jdbcclient}/application.properties (100%) rename persistence-modules/spring-jdbc-2/src/main/resources/{com.baeldung.jdbcClient => jdbcclient}/drop_student.sql (100%) rename persistence-modules/spring-jdbc-2/src/main/resources/{com.baeldung.jdbcClient => jdbcclient}/student.sql (100%) rename persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/{jdbcClient => jdbcclient}/JdbcClientUnitTest.java (89%) diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java similarity index 80% rename from persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java rename to persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java index fe1a203eff..3453671cca 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/JdbcClientDemoApplication.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java @@ -1,11 +1,11 @@ -package com.baeldung.jdbcClient; +package com.baeldung.jdbcclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.jdbcClient") +@ComponentScan(basePackages = "jdbcclient") public class JdbcClientDemoApplication { public static void main(String[] args) { diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/dao/StudentDao.java similarity index 95% rename from persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java rename to persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/dao/StudentDao.java index 4ca2046a0e..ba5bfcee11 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/dao/StudentDao.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/dao/StudentDao.java @@ -1,8 +1,8 @@ -package com.baeldung.jdbcClient.dao; +package com.baeldung.jdbcclient.dao; -import com.baeldung.jdbcClient.model.Student; -import com.baeldung.jdbcClient.model.StudentResultExtractor; -import com.baeldung.jdbcClient.model.StudentRowMapper; +import com.baeldung.jdbcclient.model.Student; +import com.baeldung.jdbcclient.model.StudentResultExtractor; +import com.baeldung.jdbcclient.model.StudentRowMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/Student.java similarity index 96% rename from persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java rename to persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/Student.java index 2e4ff69464..3de8a6e1f9 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/Student.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/Student.java @@ -1,4 +1,4 @@ -package com.baeldung.jdbcClient.model; +package com.baeldung.jdbcclient.model; public class Student { private Integer studentId; diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentResultExtractor.java similarity index 95% rename from persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java rename to persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentResultExtractor.java index 2bc8a249c5..29cb60cee9 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentResultExtractor.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentResultExtractor.java @@ -1,4 +1,4 @@ -package com.baeldung.jdbcClient.model; +package com.baeldung.jdbcclient.model; import org.springframework.jdbc.core.ResultSetExtractor; diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentRowMapper.java similarity index 94% rename from persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java rename to persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentRowMapper.java index 22a98e0efa..c387a6c485 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcClient/model/StudentRowMapper.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/model/StudentRowMapper.java @@ -1,4 +1,4 @@ -package com.baeldung.jdbcClient.model; +package com.baeldung.jdbcclient.model; import org.springframework.jdbc.core.RowMapper; diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties b/persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/application.properties similarity index 100% rename from persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/application.properties rename to persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/application.properties diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql b/persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/drop_student.sql similarity index 100% rename from persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/drop_student.sql rename to persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/drop_student.sql diff --git a/persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql b/persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/student.sql similarity index 100% rename from persistence-modules/spring-jdbc-2/src/main/resources/com.baeldung.jdbcClient/student.sql rename to persistence-modules/spring-jdbc-2/src/main/resources/jdbcclient/student.sql diff --git a/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java similarity index 89% rename from persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java rename to persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java index b07a3c16f0..42ac1eb4d0 100644 --- a/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcClient/JdbcClientUnitTest.java +++ b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java @@ -1,7 +1,7 @@ -package com.baeldung.jdbcClient; +package com.baeldung.jdbcclient; -import com.baeldung.jdbcClient.dao.StudentDao; -import com.baeldung.jdbcClient.model.Student; +import com.baeldung.jdbcclient.dao.StudentDao; +import com.baeldung.jdbcclient.model.Student; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; @@ -20,10 +20,10 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) -@Sql(value = "/com.baeldung.jdbcClient/student.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) -@Sql(value = "/com.baeldung.jdbcClient/drop_student.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +@Sql(value = "/jdbcclient/student.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(value = "/jdbcclient/drop_student.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) @SpringBootTest(classes = JdbcClientDemoApplication.class) -@TestPropertySource(locations = {"classpath:com.baeldung.jdbcClient/application.properties"}) +@TestPropertySource(locations = {"classpath:jdbcclient/application.properties"}) public class JdbcClientUnitTest { private static final Logger logger = LoggerFactory.getLogger(JdbcClientUnitTest.class); From 78f5072f7c93b46ccb6acc62fa0210be2e8d7ccd Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 25 Oct 2023 15:10:31 +0530 Subject: [PATCH 228/831] BAEL-7135 updated component scan --- .../java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java index 3453671cca..d10124fdef 100644 --- a/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java +++ b/persistence-modules/spring-jdbc-2/src/main/java/com/baeldung/jdbcclient/JdbcClientDemoApplication.java @@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = "jdbcclient") +@ComponentScan(basePackages = "com.baledung.jdbcclient") public class JdbcClientDemoApplication { public static void main(String[] args) { From 3c8e7eb634053b7031d277ab7789b7ccbfd2b75a Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 25 Oct 2023 15:48:55 +0530 Subject: [PATCH 229/831] BAEL-7135 migrated to junit 5 --- persistence-modules/spring-jdbc-2/pom.xml | 1 + .../jdbcclient/JdbcClientUnitTest.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/persistence-modules/spring-jdbc-2/pom.xml b/persistence-modules/spring-jdbc-2/pom.xml index 24744b28dc..ce79c1c615 100644 --- a/persistence-modules/spring-jdbc-2/pom.xml +++ b/persistence-modules/spring-jdbc-2/pom.xml @@ -86,6 +86,7 @@ 3.2.0-SNAPSHOT + 5.10.0 UTF-8 diff --git a/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java index 42ac1eb4d0..be30efcb9c 100644 --- a/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java +++ b/persistence-modules/spring-jdbc-2/src/test/java/com/baeldung/jdbcclient/JdbcClientUnitTest.java @@ -2,15 +2,13 @@ package com.baeldung.jdbcclient; import com.baeldung.jdbcclient.dao.StudentDao; import com.baeldung.jdbcclient.model.Student; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; import java.util.List; import java.util.Map; @@ -19,11 +17,11 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -@RunWith(SpringRunner.class) @Sql(value = "/jdbcclient/student.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @Sql(value = "/jdbcclient/drop_student.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) @SpringBootTest(classes = JdbcClientDemoApplication.class) @TestPropertySource(locations = {"classpath:jdbcclient/application.properties"}) + public class JdbcClientUnitTest { private static final Logger logger = LoggerFactory.getLogger(JdbcClientUnitTest.class); @@ -31,14 +29,14 @@ public class JdbcClientUnitTest { private StudentDao studentDao; @Test - public void givenJdbcClient_whenInsertWithNamedParamAndSqlType_thenSuccess() { + void givenJdbcClient_whenInsertWithNamedParamAndSqlType_thenSuccess() { logger.info("testing invoked successfully"); Student student = getSampleStudent("Johny Dep", 8, 4, "Male", "New York"); assertEquals(1, studentDao.insertWithSetParamWithNamedParamAndSqlType(student)); } @Test - public void givenJdbcClient_whenQueryWithPositionalParams_thenSuccess() { + void givenJdbcClient_whenQueryWithPositionalParams_thenSuccess() { logger.info("testing invoked successfully"); List students = studentDao.getStudentsOfGradeStateAndGenderWithPositionalParams( 1, "New York", "Male"); @@ -47,7 +45,7 @@ public class JdbcClientUnitTest { } @Test - public void givenJdbcClient_whenQueryWithParamsInVarargs_thenSuccess() { + void givenJdbcClient_whenQueryWithParamsInVarargs_thenSuccess() { logger.info("testing invoked successfully"); Student student = studentDao.getStudentsOfGradeStateAndGenderWithParamsInVarargs( 1, "New York", "Male"); @@ -55,7 +53,7 @@ public class JdbcClientUnitTest { } @Test - public void givenJdbcClient_whenQueryWithParamsInList_thenSuccess() { + void givenJdbcClient_whenQueryWithParamsInList_thenSuccess() { logger.info("testing invoked successfully"); List params = List.of(1, "New York", "Male"); Optional optional = studentDao.getStudentsOfGradeStateAndGenderWithParamsInList(params); @@ -67,14 +65,14 @@ public class JdbcClientUnitTest { } @Test - public void givenJdbcClient_whenQueryWithParamsIndex_thenSuccess() { + void givenJdbcClient_whenQueryWithParamsIndex_thenSuccess() { logger.info("testing invoked successfully"); List students = studentDao.getStudentsOfGradeStateAndGenderWithParamIndex( 1, "New York", "Male"); assertEquals(6, students.size()); } @Test - public void givenJdbcClient_whenQueryWithNamedParam_thenSuccess() { + void givenJdbcClient_whenQueryWithNamedParam_thenSuccess() { logger.info("testing invoked successfully"); Integer count = studentDao.getCountOfStudentsOfGradeStateAndGenderWithNamedParam( 1, "New York", "Male"); @@ -82,7 +80,7 @@ public class JdbcClientUnitTest { assertEquals(6, count); } @Test - public void givenJdbcClient_whenQueryWithParamMap_thenSuccess() { + void givenJdbcClient_whenQueryWithParamMap_thenSuccess() { logger.info("testing invoked successfully"); Map paramMap = Map.of( "grade", 1, From 6807803bd328c1c375a6697617ab7fb9c743a724 Mon Sep 17 00:00:00 2001 From: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com> Date: Wed, 25 Oct 2023 17:10:55 +0530 Subject: [PATCH 230/831] Renamed file to skip test in jenkins (#14870) * Renamed file to skip test in jenkins * javadoc add --- .../cassandra/inquery/ProductRepositoryNestedLiveTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/cassandra/inquery/ProductRepositoryNestedLiveTest.java b/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/cassandra/inquery/ProductRepositoryNestedLiveTest.java index 3592c8b80d..3d99782afd 100644 --- a/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/cassandra/inquery/ProductRepositoryNestedLiveTest.java +++ b/persistence-modules/spring-data-cassandra-2/src/test/java/org/baeldung/cassandra/inquery/ProductRepositoryNestedLiveTest.java @@ -20,7 +20,9 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; - +/** + * This live test requires a running Docker instance so that a Cassandra container can be created + */ @Testcontainers @SpringBootTest class ProductRepositoryNestedLiveTest { From 69aaf2dbf72d13e5b76a8b8efe07cd0556302dbb Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:10:28 +0300 Subject: [PATCH 231/831] This commit is related to the article BAEL-7089 (#15065) This commit aims to update the evenElementsQueue queue with oddElementsQueue. --- .../RemoveQueueElementsUnitTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java index 66cfade866..38fdc58099 100644 --- a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/removequeueelements/RemoveQueueElementsUnitTest.java @@ -12,7 +12,7 @@ public class RemoveQueueElementsUnitTest { @Test public void givenQueueWithEvenAndOddNumbers_whenRemovingEvenNumbers_thenOddNumbersRemain() { Queue queue = new LinkedList<>(); - Queue evenElementsQueue = new LinkedList<>(); + Queue oddElementsQueue = new LinkedList<>(); queue.add(1); queue.add(2); queue.add(3); @@ -22,14 +22,14 @@ public class RemoveQueueElementsUnitTest { while (queue.peek() != null) { int element = queue.remove(); if (element % 2 != 0) { - evenElementsQueue.add(element); + oddElementsQueue.add(element); } } - assertEquals(3, evenElementsQueue.size()); - assertTrue(evenElementsQueue.contains(1)); - assertTrue(evenElementsQueue.contains(3)); - assertTrue(evenElementsQueue.contains(5)); + assertEquals(3, oddElementsQueue.size()); + assertTrue(oddElementsQueue.contains(1)); + assertTrue(oddElementsQueue.contains(3)); + assertTrue(oddElementsQueue.contains(5)); } @Test From f182b714a94aa0315dc770616f6af7a1b34b803a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 25 Oct 2023 22:42:51 +0530 Subject: [PATCH 232/831] JAVA-26379 Fix failing test --- spring-web-modules/spring-mvc-xml-2/pom.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/spring-web-modules/spring-mvc-xml-2/pom.xml b/spring-web-modules/spring-mvc-xml-2/pom.xml index f4326ccf68..8c0062f538 100644 --- a/spring-web-modules/spring-mvc-xml-2/pom.xml +++ b/spring-web-modules/spring-mvc-xml-2/pom.xml @@ -19,12 +19,12 @@ org.springframework spring-web - ${org.springframework.version} + ${spring.version} org.springframework spring-webmvc - ${org.springframework.version} + ${spring.version} @@ -64,7 +64,7 @@ org.springframework.boot spring-boot-starter-test - ${spring-boot.version} + ${spring-boot-starter-test.version} test @@ -95,8 +95,6 @@ - 5.0.2.RELEASE - 1.5.10.RELEASE 5.1.40 4.4.5 4.5.2 From f5bb9479b455c4a2e4faebeeabeb95bcc7244690 Mon Sep 17 00:00:00 2001 From: emanueltrandafir1993 Date: Wed, 25 Oct 2023 19:53:50 +0200 Subject: [PATCH 233/831] MKT-7001: formatting --- .../retry/RetryCompletableFutureUnitTest.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java index 7f1ea41f92..ea49f0fa08 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFutureUnitTest.java @@ -29,10 +29,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryTask(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); + assertThat(result.join()).isEqualTo(100); + assertThat(retriesCounter).hasValue(4); } @Test @@ -52,10 +50,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryUnsafe(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); + assertThat(result.join()).isEqualTo(100); + assertThat(retriesCounter).hasValue(4); } @Test @@ -65,8 +61,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryUnsafe(codeToRun, 3); assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) - .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); + .isInstanceOf(CompletionException.class) + .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); } @Test @@ -75,10 +71,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryExceptionallyAsync(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); + assertThat(result.join()).isEqualTo(100); + assertThat(retriesCounter).hasValue(4); } @Test @@ -88,7 +82,7 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryExceptionallyAsync(codeToRun, 3); assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) + .isInstanceOf(CompletionException.class) .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); } @@ -98,10 +92,8 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryNesting(codeToRun, 10); - assertThat(result.join()) - .isEqualTo(100); - assertThat(retriesCounter) - .hasValue(4); + assertThat(result.join()).isEqualTo(100); + assertThat(retriesCounter).hasValue(4); } @Test @@ -111,7 +103,7 @@ class RetryCompletableFutureUnitTest { CompletableFuture result = retryNesting(codeToRun, 3); assertThatThrownBy(result::join) - .isInstanceOf(CompletionException.class) + .isInstanceOf(CompletionException.class) .hasMessageContaining("RuntimeException: task failed for 3 time(s)"); } From b4db616646fece37908ed789ccec7ca7dbc10a42 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Thu, 26 Oct 2023 08:18:01 +0200 Subject: [PATCH 234/831] BAEL-7026: Check If a String Contains a Number Value in Java (#14867) Co-authored-by: Luis Javier Peris Morillo --- .../core-java-string-operations-7/pom.xml | 142 +++++++++--------- .../StrContainsNumberUtils.java | 77 ++++++++++ .../StrContainsNumberUtilsUnitTest.java | 69 +++++++++ 3 files changed, 217 insertions(+), 71 deletions(-) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/strcontainsnumber/StrContainsNumberUtils.java create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/strcontainsnumber/StrContainsNumberUtilsUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/pom.xml b/core-java-modules/core-java-string-operations-7/pom.xml index 595f918fcd..a2c7036e34 100644 --- a/core-java-modules/core-java-string-operations-7/pom.xml +++ b/core-java-modules/core-java-string-operations-7/pom.xml @@ -1,72 +1,72 @@ - - - 4.0.0 - core-java-string-operations-7 - core-java-string-operations-7 - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - org.apache.commons - commons-lang3 - ${apache.commons.lang3.version} - - - org.apache.commons - commons-text - ${commons-text.version} - - - org.liquibase - liquibase-core - 4.9.1 - test - - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - org.liquibase - liquibase-core - 4.9.1 - test - - - junit - junit - 4.13.2 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${maven.compiler.source} - ${maven.compiler.target} - - - - - - - 11 - 11 - 3.12.0 - 1.10.0 - - + + + 4.0.0 + core-java-string-operations-7 + core-java-string-operations-7 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + ${apache.commons.lang3.version} + + + org.apache.commons + commons-text + ${commons-text.version} + + + org.liquibase + liquibase-core + 4.9.1 + test + + + org.junit.jupiter + junit-jupiter + 5.8.1 + test + + + org.liquibase + liquibase-core + 4.9.1 + test + + + junit + junit + 4.13.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 11 + 11 + 3.13.0 + 1.10.0 + + \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/strcontainsnumber/StrContainsNumberUtils.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/strcontainsnumber/StrContainsNumberUtils.java new file mode 100644 index 0000000000..a609b94cb8 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/strcontainsnumber/StrContainsNumberUtils.java @@ -0,0 +1,77 @@ +package com.baeldung.strcontainsnumber; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import com.google.common.base.CharMatcher; + +public class StrContainsNumberUtils { + + static boolean checkUsingMatchesMethod(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + return input.matches(".*\\d.*"); + } + + static boolean checkUsingPatternClass(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + return Pattern.compile(".*\\d.*") + .matcher(input) + .matches(); + } + + static boolean checkUsingReplaceAllMethod(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + String result = input.replaceAll("\\d", ""); + return result.length() != input.length(); + } + + static boolean checkUsingIsDigitMethod(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + for (char c : input.toCharArray()) { + if (Character.isDigit(c)) { + return true; + } + } + + return false; + } + + static boolean checkUsingStreamApi(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + return input.chars() + .anyMatch(Character::isDigit); + } + + static boolean checkUsingApacheCommonsLang(String input) { + String result = StringUtils.getDigits(input); + return result != null && !result.isEmpty(); + } + + static boolean checkUsingGuava(String input) { + if (input == null || input.isEmpty()) { + return false; + } + + String result = CharMatcher.forPredicate(Character::isDigit) + .retainFrom(input); + + return !result.isEmpty(); + } + +} diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/strcontainsnumber/StrContainsNumberUtilsUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/strcontainsnumber/StrContainsNumberUtilsUnitTest.java new file mode 100644 index 0000000000..9a60a827e0 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/strcontainsnumber/StrContainsNumberUtilsUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.strcontainsnumber; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.Test; + +public class StrContainsNumberUtilsUnitTest { + + private static final String INPUT_WITH_NUMBERS = "We hope 2024 will be great"; + private static final String INPUT_WITHOUT_NUMBERS = "Hello world"; + + @Test + public void givenInputString_whenUsingMatchesMethod_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingMatchesMethod(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod("")); + assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod(null)); + } + + @Test + public void givenInputString_whenUsingPatternClass_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingPatternClass(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingPatternClass(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingPatternClass("")); + assertFalse(StrContainsNumberUtils.checkUsingPatternClass(null)); + } + + @Test + public void givenInputString_whenUsingReplaceAllMethod_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingReplaceAllMethod(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod("")); + assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod(null)); + } + + @Test + public void givenInputString_whenUsingIsDigitMethod_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingIsDigitMethod(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod("")); + assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod(null)); + } + + @Test + public void givenInputString_whenUsingStreamApi_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingStreamApi(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingStreamApi(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingStreamApi("")); + assertFalse(StrContainsNumberUtils.checkUsingStreamApi(null)); + } + + @Test + public void givenInputString_whenUsingApacheCommonsLang_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingApacheCommonsLang(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang("")); + assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang(null)); + } + + @Test + public void givenInputString_whenUsingGuava_ThenCheck() { + assertTrue(StrContainsNumberUtils.checkUsingGuava(INPUT_WITH_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingGuava(INPUT_WITHOUT_NUMBERS)); + assertFalse(StrContainsNumberUtils.checkUsingGuava("")); + assertFalse(StrContainsNumberUtils.checkUsingGuava(null)); + } + +} From ed75b80958f0ce23157017a2dde51baa2d7471f9 Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Thu, 26 Oct 2023 23:15:14 +0530 Subject: [PATCH 235/831] Added few more changes to accommodate review comments. --- .../langchain/ChainWithDocumentLiveTest.java | 32 ++++--------------- .../langchain/ChatWithDocumentLiveTest.java | 29 ++++------------- .../langchain/ChatWithMemoryLiveTest.java | 27 ++++++++-------- .../com/baeldung/langchain/Constants.java | 2 +- .../langchain/PromptTemplatesLiveTest.java | 7 ++-- .../langchain/ServiceWithToolsLiveTest.java | 3 +- 6 files changed, 32 insertions(+), 68 deletions(-) diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java index 556f394866..804a052990 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java @@ -2,15 +2,10 @@ package com.baeldung.langchain; import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocument; import static java.time.Duration.ofSeconds; +import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Path; import java.nio.file.Paths; -import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,11 +26,11 @@ import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; public class ChainWithDocumentLiveTest { - - Logger logger = LoggerFactory.getLogger(ChainWithDocumentLiveTest.class); + + private static final Logger logger = LoggerFactory.getLogger(ChainWithDocumentLiveTest.class); @Test - public void givenDocument_whenPrompted_thenValidResponse() { + public void givenChainWithDocument_whenPrompted_thenValidResponse() { EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); @@ -47,7 +42,7 @@ public class ChainWithDocumentLiveTest { .embeddingStore(embeddingStore) .build(); - Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); + Document document = loadDocument(Paths.get("src/test/resources/example-files/simpson's_adventures.txt")); ingestor.ingest(document); ChatLanguageModel chatModel = OpenAiChatModel.builder() @@ -59,27 +54,14 @@ public class ChainWithDocumentLiveTest { .chatLanguageModel(chatModel) .retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) - .promptTemplate(PromptTemplate - .from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}")) + .promptTemplate(PromptTemplate.from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}")) .build(); String answer = chain.execute("Who is Simpson?"); logger.info(answer); - Assert.assertNotNull(answer); + assertNotNull(answer); } - private static Path toPath(String fileName) { - try { - URL fileUrl = new File(fileName).toURI() - .toURL(); - System.out.println(new File(fileName).toURI() - .toURL()); - return Paths.get(fileUrl.toURI()); - } catch (URISyntaxException | MalformedURLException e) { - throw new RuntimeException(e); - } - } - } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java index a7dc89afde..7ae50c6bc4 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java @@ -4,18 +4,13 @@ import static dev.langchain4j.data.document.FileSystemDocumentLoader.loadDocumen import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; import static java.time.Duration.ofSeconds; import static java.util.stream.Collectors.joining; +import static org.junit.Assert.assertNotNull; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,13 +33,13 @@ import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; public class ChatWithDocumentLiveTest { - - Logger logger = LoggerFactory.getLogger(ChatWithDocumentLiveTest.class); + + private static final Logger logger = LoggerFactory.getLogger(ChatWithDocumentLiveTest.class); @Test - public void givenChainWithDocument_whenPrompted_thenValidResponse() { + public void givenDocument_whenPrompted_thenValidResponse() { - Document document = loadDocument(toPath("src/test/resources/example-files/simpson's_adventures.txt")); + Document document = loadDocument(Paths.get("src/test/resources/example-files/simpson's_adventures.txt")); DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO)); List segments = splitter.split(document); @@ -81,20 +76,8 @@ public class ChatWithDocumentLiveTest { .content(); logger.info(aiMessage.text()); - Assert.assertNotNull(aiMessage.text()); + assertNotNull(aiMessage.text()); } - private static Path toPath(String fileName) { - try { - URL fileUrl = new File(fileName).toURI() - .toURL(); - System.out.println(new File(fileName).toURI() - .toURL()); - return Paths.get(fileUrl.toURI()); - } catch (URISyntaxException | MalformedURLException e) { - throw new RuntimeException(e); - } - } - } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java index 8f7dcca1cb..cae6a7930a 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java @@ -1,5 +1,14 @@ package com.baeldung.langchain; +import static dev.langchain4j.data.message.UserMessage.userMessage; +import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.TokenWindowChatMemory; @@ -7,18 +16,9 @@ import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.model.openai.OpenAiTokenizer; -import static dev.langchain4j.data.message.UserMessage.userMessage; -import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Assert; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class ChatWithMemoryLiveTest { - - Logger logger = LoggerFactory.getLogger(ChatWithMemoryLiveTest.class); + + private static final Logger logger = LoggerFactory.getLogger(ChatWithMemoryLiveTest.class); @Test public void givenMemory_whenPrompted_thenValidResponse() { @@ -30,15 +30,16 @@ public class ChatWithMemoryLiveTest { AiMessage answer = model.generate(chatMemory.messages()) .content(); logger.info(answer.text()); - Assert.assertNotNull(answer.text()); chatMemory.add(answer); + assertNotNull(answer.text()); chatMemory.add(userMessage("What is my name?")); AiMessage answerWithName = model.generate(chatMemory.messages()) .content(); logger.info(answerWithName.text()); - assertThat(answerWithName.text().contains("Kumar")); chatMemory.add(answerWithName); + assertThat(answerWithName.text() + .contains("Kumar")); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java index 149858f351..b468b3a065 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java @@ -7,6 +7,6 @@ public class Constants { * registering for free at (https://platform.openai.com/signup) and then by navigating * to "Create new secret key" page at (https://platform.openai.com/account/api-keys). */ - public static String OPEN_AI_KEY = ""; + public static String OPEN_AI_KEY = "demo"; //""; } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java index 31698ee0c7..1350872eb1 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java @@ -1,6 +1,7 @@ package com.baeldung.langchain; import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; +import static org.junit.Assert.assertNotNull; import java.util.HashMap; import java.util.Map; @@ -14,11 +15,9 @@ import dev.langchain4j.model.input.Prompt; import dev.langchain4j.model.input.PromptTemplate; import dev.langchain4j.model.openai.OpenAiChatModel; -import org.junit.Assert; - public class PromptTemplatesLiveTest { - Logger logger = LoggerFactory.getLogger(PromptTemplatesLiveTest.class); + private static final Logger logger = LoggerFactory.getLogger(PromptTemplatesLiveTest.class); @Test public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() { @@ -37,7 +36,7 @@ public class PromptTemplatesLiveTest { String response = model.generate(prompt.text()); logger.info(response); - Assert.assertNotNull(response); + assertNotNull(response); } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java index 6a6144aa21..9d64d1fc97 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java @@ -2,7 +2,6 @@ package com.baeldung.langchain; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +13,7 @@ import dev.langchain4j.service.AiServices; public class ServiceWithToolsLiveTest { - Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class); + private static final Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class); static class Calculator { From 450b6d8025dd076cfb069e60969fe84f646a8cc9 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:25:17 +0530 Subject: [PATCH 236/831] Create StringIterator.java --- .../baeldung/stringIterator/StringIterator.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java new file mode 100644 index 0000000000..2ffabc48d4 --- /dev/null +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java @@ -0,0 +1,14 @@ +package com.baeldung.stringIterator; + +public class StringIterator { + public static void main(String[] args) { + String str = "Hello, Baeldung!"; + java8forEach(str); + } + + public static void java8forEach(String str){ + str.chars().forEach(name -> { + System.out.print((char) name); + }); + } +} From d3d60f392b77c69677e02dfc8407df7e5b1aea72 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:41:32 +0530 Subject: [PATCH 237/831] Update StringIterator.java --- .../stringIterator/StringIterator.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java index 2ffabc48d4..cbd69a151a 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java @@ -1,14 +1,53 @@ package com.baeldung.stringIterator; +import java.text.*; +import java.util.*; + public class StringIterator { public static void main(String[] args) { String str = "Hello, Baeldung!"; + javaforLoop(str); + System.out.println(); java8forEach(str); + System.out.println(); + javaCharArray(str); + System.out.println(); + javaRegexExp(str); + System.out.println(); + javaCharacterIterator(str); } - + + public static void javaCharArray(String str){ + for (char c : str.toCharArray()) { + System.out.print(c); + } + } + + public static void javaforLoop(String str) { + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + System.out.print(c); + } + } + public static void java8forEach(String str){ str.chars().forEach(name -> { System.out.print((char) name); }); } + + public static void javaRegexExp(String str){ + String[] characters = str.split(""); + for (String c : characters) { + System.out.print(c); + } + } + + public static void javaCharacterIterator(String str){ + CharacterIterator it = new StringCharacterIterator(str); + while (it.current() != CharacterIterator.DONE) { + System.out.print(it.current()); + it.next(); + } + } } From 0fa77ed809e43b24e7dc474308eb461e5a7c708e Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:45:34 +0530 Subject: [PATCH 238/831] Create StringIteratorTest.java --- .../java/com/baeldung/stringIterator/StringIteratorTest.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java new file mode 100644 index 0000000000..9daeafb986 --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java @@ -0,0 +1 @@ +test From 7aeb97fcdfe49b2518512339356462ced27a5966 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:57:27 +0530 Subject: [PATCH 239/831] Update StringIterator.java --- .../stringIterator/StringIterator.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java index cbd69a151a..0f7cd2a7f7 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java @@ -6,48 +6,54 @@ import java.util.*; public class StringIterator { public static void main(String[] args) { String str = "Hello, Baeldung!"; - javaforLoop(str); - System.out.println(); - java8forEach(str); - System.out.println(); - javaCharArray(str); - System.out.println(); - javaRegexExp(str); - System.out.println(); - javaCharacterIterator(str); + System.out.println(javaforLoop(str)); + System.out.println(java8forEach(str)); + System.out.println(javaCharArray(str)); + System.out.println(javaRegexExp(str)); + System.out.println(javaCharacterIterator(str)); } - public static void javaCharArray(String str){ + public static String javaCharArray(String str){ + StringBuilder result = new StringBuilder(); for (char c : str.toCharArray()) { - System.out.print(c); + result.append(c); } + return result.toString(); } - public static void javaforLoop(String str) { + public static String javaforLoop(String str) { + StringBuilder result = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); - System.out.print(c); + result.append(c); } + return result.toString(); } - public static void java8forEach(String str){ + public static String java8forEach(String str){ + StringBuilder result = new StringBuilder(); str.chars().forEach(name -> { - System.out.print((char) name); + result.append((char) name); }); + return result.toString(); } - public static void javaRegexExp(String str){ + public static String javaRegexExp(String str){ + StringBuilder result = new StringBuilder(); String[] characters = str.split(""); for (String c : characters) { - System.out.print(c); + result.append(c); } + return result.toString(); } - public static void javaCharacterIterator(String str){ + public static String javaCharacterIterator(String str){ + StringBuilder result = new StringBuilder(); CharacterIterator it = new StringCharacterIterator(str); while (it.current() != CharacterIterator.DONE) { - System.out.print(it.current()); + result.append(it.current()); it.next(); } + return result.toString(); } } From aa7ad247e1c7d8e53c0fcb3554d60ff8807fa82b Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 00:02:38 +0530 Subject: [PATCH 240/831] Update StringIteratorTest.java --- .../stringIterator/StringIteratorTest.java | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java index 9daeafb986..8f7b853bc2 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java @@ -1 +1,47 @@ -test +package com.baeldung.stringIterator; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +public class StringIteratorTest { + + @Test + public void testJavaCharArray() { + String input = "Hello, Baeldung!"; + String expectedOutput = "Hello, Baeldung!"; + String result = StringIterator.javaCharArray(input); + assertEquals(expectedOutput, result); + } + + @Test + public void testJavaForLoop() { + String input = "Hello, Baeldung!"; + String expectedOutput = "Hello, Baeldung!"; + String result = StringIterator.javaForLoop(input); + assertEquals(expectedOutput, result); + } + + @Test + public void testJava8ForEach() { + String input = "Hello, Baeldung!"; + String expectedOutput = "Hello, Baeldung!"; + String result = StringIterator.java8ForEach(input); + assertEquals(expectedOutput, result); + } + + @Test + public void testJavaRegExp() { + String input = "Hello, Baeldung!"; + String expectedOutput = "Hello, Baeldung!"; + String result = StringIterator.javaRegExp(input); + assertEquals(expectedOutput, result); + } + + @Test + public void testJavaCharacterIterator() { + String input = "Hello, Baeldung!"; + String expectedOutput = "Hello, Baeldung!"; + String result = StringIterator.javaCharacterIterator(input); + assertEquals(expectedOutput, result); + } +} From 9f1ce56f8260557130b8695d4785fe7077ac32a7 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 00:09:53 +0530 Subject: [PATCH 241/831] Update StringIteratorTest.java --- .../baeldung/stringIterator/StringIteratorTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java index 8f7b853bc2..2caec944f5 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.*; public class StringIteratorTest { @Test - public void testJavaCharArray() { + public void whenUseCharArrayMethod_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; String result = StringIterator.javaCharArray(input); @@ -14,7 +14,7 @@ public class StringIteratorTest { } @Test - public void testJavaForLoop() { + public void whenUseJavaForLoop_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; String result = StringIterator.javaForLoop(input); @@ -22,7 +22,7 @@ public class StringIteratorTest { } @Test - public void testJava8ForEach() { + public void whenUseForEachMethod_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; String result = StringIterator.java8ForEach(input); @@ -30,7 +30,7 @@ public class StringIteratorTest { } @Test - public void testJavaRegExp() { + public void whenUseRegexSplit_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; String result = StringIterator.javaRegExp(input); @@ -38,7 +38,7 @@ public class StringIteratorTest { } @Test - public void testJavaCharacterIterator() { + public void whenUseCharacterIterator_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; String result = StringIterator.javaCharacterIterator(input); From d9c72a1c1af4d0c01ba518fef819a65a548efd4f Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 27 Oct 2023 05:44:00 +0100 Subject: [PATCH 242/831] Limit for Repository Query Methods (#15055) * Limit for Repository Query Methods * Limit for Repository Query Methods --- .../java/com/baeldung/boot/passenger/PassengerRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/persistence-modules/spring-data-jpa-query/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java b/persistence-modules/spring-data-jpa-query/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java index 14d5403cb5..7b5a307b81 100644 --- a/persistence-modules/spring-data-jpa-query/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java +++ b/persistence-modules/spring-data-jpa-query/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java @@ -12,6 +12,9 @@ interface PassengerRepository extends JpaRepository, CustomPass Passenger findTopByOrderBySeatNumberAsc(); List findByOrderBySeatNumberAsc(); + + //The Limit type is a new feature in Spring Data JPA version 3.2 + //List findByOrderBySeatNumberAsc(Limit limit); List findByFirstNameIgnoreCase(String firstName); From 16b931c4df6ad17d5ab4e0a58e32018bba92b550 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Fri, 27 Oct 2023 08:46:04 +0200 Subject: [PATCH 243/831] BAEL-7055: How can I capitalize the first letter of each word in a string? (#14927) Co-authored-by: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> --- ...CapitalizeFirstCharacterEachWordUtils.java | 40 +++++++++++++++++++ ...zeFirstCharacterEachWordUtilsUnitTest.java | 38 ++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtils.java create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtilsUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtils.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtils.java new file mode 100644 index 0000000000..cccc745499 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtils.java @@ -0,0 +1,40 @@ +package com.baeldung.capitalizefirstcharactereachword; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; + +class CapitalizeFirstCharacterEachWordUtils { + + static String usingCharacterToUpperCaseMethod(String input) { + if (input == null || input.isEmpty()) { + return null; + } + + return Arrays.stream(input.split("\\s+")) + .map(word -> Character.toUpperCase(word.charAt(0)) + word.substring(1)) + .collect(Collectors.joining(" ")); + } + + static String usingStringToUpperCaseMethod(String input) { + if (input == null || input.isEmpty()) { + return null; + } + + return Arrays.stream(input.split("\\s+")) + .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1)) + .collect(Collectors.joining(" ")); + } + + static String usingStringUtilsClass(String input) { + if (input == null || input.isEmpty()) { + return null; + } + + return Arrays.stream(input.split("\\s+")) + .map(StringUtils::capitalize) + .collect(Collectors.joining(" ")); + } + +} diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtilsUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtilsUnitTest.java new file mode 100644 index 0000000000..27c7ddb4c4 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/capitalizefirstcharactereachword/CapitalizeFirstCharacterEachWordUtilsUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.capitalizefirstcharactereachword; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.commons.text.WordUtils; +import org.junit.jupiter.api.Test; + +class CapitalizeFirstCharacterEachWordUtilsUnitTest { + + @Test + void givenString_whenUsingCharacterToUpperCaseMethod_thenCapitalizeFirstCharacter() { + String input = "hello baeldung visitors"; + + assertEquals("Hello Baeldung Visitors", CapitalizeFirstCharacterEachWordUtils.usingCharacterToUpperCaseMethod(input)); + } + + @Test + void givenString_whenUsingSubstringMethod_thenCapitalizeFirstCharacter() { + String input = "Hi, my name is azhrioun"; + + assertEquals("Hi, My Name Is Azhrioun", CapitalizeFirstCharacterEachWordUtils.usingStringToUpperCaseMethod(input)); + } + + @Test + void givenString_whenUsingStringUtilsClass_thenCapitalizeFirstCharacter() { + String input = "life is short the world is wide"; + + assertEquals("Life Is Short The World Is Wide", CapitalizeFirstCharacterEachWordUtils.usingStringUtilsClass(input)); + } + + @Test + void givenString_whenUsingWordUtilsClass_thenCapitalizeFirstCharacter() { + String input = "smile sunshine is good for your teeth"; + + assertEquals("Smile Sunshine Is Good For Your Teeth", WordUtils.capitalizeFully(input)); + } + +} From 002def2d241829c9ed3d6e31eb7174cc7e0f767b Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 14:49:09 +0530 Subject: [PATCH 244/831] Delete core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java --- .../com/baeldung/shallowdeepcopy/School.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java deleted file mode 100644 index 28a751741e..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/School.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.shallowdeepcopy; - -class School { - private String schoolName; - public School(School sc) { - this(sc.getSchoolName()); - } - public School(String schoolName) { - this.schoolName = schoolName; - } - // standard getters and setters -} - -@Override -public Object clone() { - try { - return (School) super.clone(); - } catch (CloneNotSupportedException e) { - return new School(this.getSchoolName()); - } -} - From f20dbd4ed9d5ed917b1436fd1c2e600e5ddfe66c Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 14:49:29 +0530 Subject: [PATCH 245/831] Delete core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java --- .../com/baeldung/shallowdeepcopy/Student.java | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java deleted file mode 100644 index 2fc34ba709..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/shallowdeepcopy/Student.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.shallowdeepcopy; - -class Student { - private String name; - private int age; - private School school; - public Student(String name, int age, School school) { - this.name = name; - this.rollno = rollno; - this.school = school; - } - public Student(Student st) { - this(st.getName(), st.getAge(), st.getSchool()); - } // standard getters and setters -} - -@Override -public Object clone() { - Student student = null; - try { - student = (Student) super.clone(); - } catch (CloneNotSupportedException e) { - student = new Student(this.getName(), this.getAge(), this.getSchool()); - } - student.school= (School) this.school.clone(); - return student; -} \ No newline at end of file From 98c8e96fcae4562c2ce85fd4869fa172a65d97e3 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 14:49:52 +0530 Subject: [PATCH 246/831] Delete core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java --- .../ShallowDeepCopyExampleTest.java | 41 ------------------- 1 file changed, 41 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java deleted file mode 100644 index a14a621dcc..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyExampleTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.shallowdeepcopy; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; - -public class ShallowDeepCopyExampleTest { - - @Test - public void whenPerformShallowCopy_thenObjectsNotSame() { - School school = new School("Baeldung School"); - Student originalStudent = new Student("John", 20, school); - Student shallowCopy = new Student(originalStudent.getName(), originalStudent.getAge(), originalStudent.getSchool()); - assertNotSame(shallowCopy, originalStudent); - } - - @Test public void whenModifyingActualObject_thenCopyAlsoChange() { - School school = new School("Baeldung School"); - Student originalStudent = new Student("John", 20, school); - Student shallowCopy = new Student(originalStudent.getName(), originalStudent.getAge(), originalStudent.getSchool()); - school.setSchoolName("New Baeldung School"); - assertEquals(shallowCopy.getSchool().getSchoolName(), originalStudent.getSchool().getSchoolName()); - } - - @Test - public void whenModifyingActualObject_thenCloneCopyNotChange() { - School school = new School("New School"); - Student originalStudent = new Student("Alice", 10, school); - Student deepCopy = (Student) originalStudent.clone(); - school.setSchoolName("New Baeldung School"); - assertNotEquals(deepCopy.getSchool().getSchoolName(), originalStudent.getSchool().getSchoolName()); - } - - @Test - public void whenModifyingActualObject_thenCopyNotChange() { - School school = new School("Baeldung School"); - Student originalStudent = new Student("Alice", 30, school); - Student deepCopy = new Student(originalStudent); - school.setSchoolName("New Baeldung School"); - assertNotEquals( originalStudent.getSchool().getSchoolName(), deepCopy.getSchool().getSchoolName()); - } -} From 66604b8e2750cd260a3839a614237f316b0a7727 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 14:51:01 +0530 Subject: [PATCH 247/831] Update StringIterator.java --- .../baeldung/stringIterator/StringIterator.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java index 0f7cd2a7f7..0e46c7eedd 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringIterator/StringIterator.java @@ -4,14 +4,6 @@ import java.text.*; import java.util.*; public class StringIterator { - public static void main(String[] args) { - String str = "Hello, Baeldung!"; - System.out.println(javaforLoop(str)); - System.out.println(java8forEach(str)); - System.out.println(javaCharArray(str)); - System.out.println(javaRegexExp(str)); - System.out.println(javaCharacterIterator(str)); - } public static String javaCharArray(String str){ StringBuilder result = new StringBuilder(); @@ -38,15 +30,6 @@ public class StringIterator { return result.toString(); } - public static String javaRegexExp(String str){ - StringBuilder result = new StringBuilder(); - String[] characters = str.split(""); - for (String c : characters) { - result.append(c); - } - return result.toString(); - } - public static String javaCharacterIterator(String str){ StringBuilder result = new StringBuilder(); CharacterIterator it = new StringCharacterIterator(str); From befba49dece94e215f4aab950d0be591305a9d98 Mon Sep 17 00:00:00 2001 From: Neetika23 <42495275+Neetika23@users.noreply.github.com> Date: Fri, 27 Oct 2023 14:52:14 +0530 Subject: [PATCH 248/831] Update StringIteratorTest.java --- .../com/baeldung/stringIterator/StringIteratorTest.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java index 2caec944f5..585d65d4be 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java @@ -29,14 +29,6 @@ public class StringIteratorTest { assertEquals(expectedOutput, result); } - @Test - public void whenUseRegexSplit_thenIterate() { - String input = "Hello, Baeldung!"; - String expectedOutput = "Hello, Baeldung!"; - String result = StringIterator.javaRegExp(input); - assertEquals(expectedOutput, result); - } - @Test public void whenUseCharacterIterator_thenIterate() { String input = "Hello, Baeldung!"; From 1028ab97c4efff930a9b8668cb84b1bf9a117c28 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 27 Oct 2023 15:57:32 +0530 Subject: [PATCH 249/831] Java 26392 Move modules to patterns-module (#15060) * JAVA-26392 Move axon module and ddd module to patterns-modules * JAVA-26292 Move ddd-contexts to patterns-module --- {axon => patterns-modules/axon}/README.md | 0 {axon => patterns-modules/axon}/pom.xml | 2 +- .../com/baeldung/axon/OrderApplication.java | 0 .../axon/OrderApplicationConfiguration.java | 0 .../commandmodel/order/OrderAggregate.java | 0 .../axon/commandmodel/order/OrderLine.java | 0 .../coreapi/commands/AddProductCommand.java | 0 .../coreapi/commands/ConfirmOrderCommand.java | 0 .../coreapi/commands/CreateOrderCommand.java | 0 .../DecrementProductCountCommand.java | 0 .../IncrementProductCountCommand.java | 0 .../coreapi/commands/ShipOrderCommand.java | 0 .../coreapi/events/OrderConfirmedEvent.java | 0 .../coreapi/events/OrderCreatedEvent.java | 0 .../coreapi/events/OrderShippedEvent.java | 0 .../coreapi/events/ProductAddedEvent.java | 0 .../events/ProductCountDecrementedEvent.java | 0 .../events/ProductCountIncrementedEvent.java | 0 .../coreapi/events/ProductRemovedEvent.java | 0 .../DuplicateOrderLineException.java | 0 .../OrderAlreadyConfirmedException.java | 0 .../exceptions/UnconfirmedOrderException.java | 0 .../queries/FindAllOrderedProductsQuery.java | 0 .../baeldung/axon/coreapi/queries/Order.java | 0 .../axon/coreapi/queries/OrderStatus.java | 0 .../coreapi/queries/OrderUpdatesQuery.java | 0 .../queries/TotalProductsShippedQuery.java | 0 .../baeldung/axon/gui/OrderRestEndpoint.java | 0 .../InMemoryOrdersEventHandler.java | 0 .../axon/querymodel/LegacyQueryHandler.java | 0 .../axon/querymodel/MongoConfiguration.java | 0 .../querymodel/MongoOrdersEventHandler.java | 0 .../axon/querymodel/OrderQueryService.java | 0 .../axon/querymodel/OrderResponse.java | 0 .../axon/querymodel/OrderStatusResponse.java | 0 .../axon/querymodel/OrdersEventHandler.java | 0 .../resources/application-mongo.properties | 0 .../src/main/resources/application.properties | 0 .../axon}/src/main/resources/logback.xml | 0 .../axon}/src/main/resources/order-api.http | 0 .../commandmodel/OrderAggregateUnitTest.java | 0 .../axon/gui/OrderRestEndpointManualTest.java | 0 .../AbstractOrdersEventHandlerUnitTest.java | 0 .../InMemoryOrdersEventHandlerUnitTest.java | 0 .../MongoOrdersEventHandlerUnitTest.java | 0 .../OrderQueryServiceIntegrationTest.java | 0 .../src/test/resources/application.properties | 0 .../axon}/start_axon_server.sh | 0 .../axon}/start_mongo.sh | 0 .../ddd-contexts}/README.md | 0 .../ddd-contexts-infrastructure/pom.xml | 0 .../infrastructure/db/InMemoryOrderStore.java | 0 .../infrastructure/events/SimpleEventBus.java | 0 .../src/main/java/module-info.java | 0 .../ddd-contexts-mainapp/pom.xml | 0 .../dddcontexts/mainapp/Application.java | 0 .../src/main/java/module-info.java | 0 .../ddd-contexts-ordercontext/pom.xml | 0 .../ordercontext/model/CustomerOrder.java | 0 .../ordercontext/model/OrderItem.java | 0 .../repository/CustomerOrderRepository.java | 0 .../service/CustomerOrderService.java | 0 .../ordercontext/service/OrderService.java | 0 .../src/main/java/module-info.java | 0 .../ddd-contexts-sharedkernel/pom.xml | 0 .../sharedkernel/events/ApplicationEvent.java | 0 .../sharedkernel/events/EventBus.java | 0 .../sharedkernel/events/EventSubscriber.java | 0 .../service/ApplicationService.java | 0 .../src/main/java/module-info.java | 0 .../ddd-contexts-shippingcontext/pom.xml | 0 .../shippingcontext/model/PackageItem.java | 0 .../shippingcontext/model/Parcel.java | 0 .../shippingcontext/model/ShippableOrder.java | 0 .../repository/ShippingOrderRepository.java | 0 .../service/ParcelShippingService.java | 0 .../service/ShippingService.java | 0 .../src/main/java/module-info.java | 0 .../ddd-contexts}/pom.xml | 2 +- {ddd => patterns-modules/ddd}/README.md | 0 {ddd => patterns-modules/ddd}/pom.xml | 2 +- .../PersistingDddAggregatesApplication.java | 24 +++++++++---------- .../java/com/baeldung/ddd/order/Order.java | 0 .../com/baeldung/ddd/order/OrderLine.java | 0 .../java/com/baeldung/ddd/order/Product.java | 0 .../config/CustomMongoConfiguration.java | 0 .../AmountBasedDiscountPolicy.java | 0 .../order/doubledispatch/DiscountPolicy.java | 0 .../doubledispatch/FlatDiscountPolicy.java | 0 .../ddd/order/doubledispatch/Order.java | 0 .../doubledispatch/SpecialDiscountPolicy.java | 0 .../order/doubledispatch/SpecialOrder.java | 0 .../visitor/HtmlOrderViewCreator.java | 0 .../doubledispatch/visitor/OrderVisitor.java | 0 .../doubledispatch/visitor/Visitable.java | 0 .../com/baeldung/ddd/order/jpa/JpaOrder.java | 0 .../baeldung/ddd/order/jpa/JpaOrderLine.java | 0 .../ddd/order/jpa/JpaOrderRepository.java | 0 .../baeldung/ddd/order/jpa/JpaProduct.java | 0 .../ddd/order/mongo/OrderMongoRepository.java | 0 .../DomainLayerApplication.java | 0 .../application/cli/CliOrderController.java | 0 .../request/AddProductRequest.java | 0 .../request/CreateOrderRequest.java | 0 .../response/CreateOrderResponse.java | 0 .../application/rest/OrderController.java | 0 .../domain/DomainException.java | 0 .../dddhexagonalspring/domain/Order.java | 0 .../dddhexagonalspring/domain/OrderItem.java | 0 .../domain/OrderStatus.java | 0 .../dddhexagonalspring/domain/Product.java | 0 .../domain/repository/OrderRepository.java | 0 .../domain/service/DomainOrderService.java | 0 .../domain/service/OrderService.java | 0 .../configuration/BeanConfiguration.java | 0 .../configuration/CassandraConfiguration.java | 0 .../configuration/MongoDBConfiguration.java | 0 .../cassandra/CassandraDbOrderRepository.java | 0 .../repository/cassandra/OrderEntity.java | 0 .../repository/cassandra/OrderItemEntity.java | 0 .../SpringDataCassandraOrderRepository.java | 0 .../mongo/MongoDbOrderRepository.java | 0 .../mongo/SpringDataMongoOrderRepository.java | 0 .../src/main/resources/ddd-layers.properties | 0 .../baeldung/ddd/order/OrderFixtureUtils.java | 0 .../com/baeldung/ddd/order/OrderUnitTest.java | 0 .../DoubleDispatchDiscountPolicyUnitTest.java | 0 .../HtmlOrderViewCreatorUnitTest.java | 0 .../MethodOverloadExampleUnitTest.java | 0 .../SingleDispatchDiscountPolicyUnitTest.java | 0 .../ddd/order/jpa/PersistOrderLiveTest.java | 0 .../ViolateOrderBusinessRulesUnitTest.java | 0 .../ddd/order/mongo/OrderMongoLiveTest.java | 0 .../domain/OrderProvider.java | 0 .../domain/OrderUnitTest.java | 0 .../service/DomainOrderServiceUnitTest.java | 0 .../CassandraDbOrderRepositoryLiveTest.java | 0 .../MongoDbOrderRepositoryLiveTest.java | 0 .../MongoDbOrderRepositoryUnitTest.java | 0 .../com/baeldung/dddhexagonalspring/README.md | 0 .../dddhexagonalspring/cassandra-init.cql | 0 .../dddhexagonalspring/docker-compose.yml | 0 .../baeldung/dddhexagonalspring/mongo-init.js | 0 .../test/resources/ddd-layers-test.properties | 0 patterns-modules/pom.xml | 13 ++++++---- pom.xml | 8 ------- 146 files changed, 23 insertions(+), 28 deletions(-) rename {axon => patterns-modules/axon}/README.md (100%) rename {axon => patterns-modules/axon}/pom.xml (98%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/OrderApplication.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/exceptions/DuplicateOrderLineException.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/exceptions/OrderAlreadyConfirmedException.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/queries/Order.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/LegacyQueryHandler.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/OrderResponse.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java (100%) rename {axon => patterns-modules/axon}/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java (100%) rename {axon => patterns-modules/axon}/src/main/resources/application-mongo.properties (100%) rename {axon => patterns-modules/axon}/src/main/resources/application.properties (100%) rename {axon => patterns-modules/axon}/src/main/resources/logback.xml (100%) rename {axon => patterns-modules/axon}/src/main/resources/order-api.http (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandlerUnitTest.java (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java (100%) rename {axon => patterns-modules/axon}/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java (100%) rename {axon => patterns-modules/axon}/src/test/resources/application.properties (100%) rename {axon => patterns-modules/axon}/start_axon_server.sh (100%) mode change 100755 => 100644 rename {axon => patterns-modules/axon}/start_mongo.sh (100%) mode change 100755 => 100644 rename {ddd-contexts => patterns-modules/ddd-contexts}/README.md (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-infrastructure/pom.xml (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-infrastructure/src/main/java/module-info.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-mainapp/pom.xml (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-mainapp/src/main/java/module-info.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/pom.xml (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-ordercontext/src/main/java/module-info.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/pom.xml (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-sharedkernel/src/main/java/module-info.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/pom.xml (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/ddd-contexts-shippingcontext/src/main/java/module-info.java (100%) rename {ddd-contexts => patterns-modules/ddd-contexts}/pom.xml (97%) rename {ddd => patterns-modules/ddd}/README.md (100%) rename {ddd => patterns-modules/ddd}/pom.xml (98%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java (96%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/Order.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/OrderLine.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/Product.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/AmountBasedDiscountPolicy.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/DiscountPolicy.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/FlatDiscountPolicy.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/Order.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialDiscountPolicy.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialOrder.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/HtmlOrderViewCreator.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/OrderVisitor.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/Visitable.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/application/cli/CliOrderController.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/application/rest/OrderController.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/CassandraConfiguration.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/CassandraDbOrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderEntity.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderItemEntity.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/SpringDataCassandraOrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/MongoDbOrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/SpringDataMongoOrderRepository.java (100%) rename {ddd => patterns-modules/ddd}/src/main/resources/ddd-layers.properties (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/OrderFixtureUtils.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/doubledispatch/DoubleDispatchDiscountPolicyUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/doubledispatch/HtmlOrderViewCreatorUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/doubledispatch/MethodOverloadExampleUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/doubledispatch/SingleDispatchDiscountPolicyUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java (100%) rename {ddd => patterns-modules/ddd}/src/test/resources/com/baeldung/dddhexagonalspring/README.md (100%) rename {ddd => patterns-modules/ddd}/src/test/resources/com/baeldung/dddhexagonalspring/cassandra-init.cql (100%) rename {ddd => patterns-modules/ddd}/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml (100%) rename {ddd => patterns-modules/ddd}/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js (100%) rename {ddd => patterns-modules/ddd}/src/test/resources/ddd-layers-test.properties (100%) diff --git a/axon/README.md b/patterns-modules/axon/README.md similarity index 100% rename from axon/README.md rename to patterns-modules/axon/README.md diff --git a/axon/pom.xml b/patterns-modules/axon/pom.xml similarity index 98% rename from axon/pom.xml rename to patterns-modules/axon/pom.xml index 5eed742aab..473a1b0e15 100644 --- a/axon/pom.xml +++ b/patterns-modules/axon/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/axon/src/main/java/com/baeldung/axon/OrderApplication.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/OrderApplication.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/OrderApplication.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/OrderApplication.java diff --git a/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/OrderApplicationConfiguration.java diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderAggregate.java diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/commandmodel/order/OrderLine.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/AddProductCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/CreateOrderCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/DecrementProductCountCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/IncrementProductCountCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderCreatedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductAddedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountDecrementedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductCountIncrementedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/events/ProductRemovedEvent.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/DuplicateOrderLineException.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/DuplicateOrderLineException.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/exceptions/DuplicateOrderLineException.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/DuplicateOrderLineException.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/OrderAlreadyConfirmedException.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/OrderAlreadyConfirmedException.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/exceptions/OrderAlreadyConfirmedException.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/OrderAlreadyConfirmedException.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/Order.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderUpdatesQuery.java diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/coreapi/queries/TotalProductsShippedQuery.java diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandler.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/LegacyQueryHandler.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/LegacyQueryHandler.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/LegacyQueryHandler.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/LegacyQueryHandler.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/MongoConfiguration.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/MongoOrdersEventHandler.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderQueryService.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderResponse.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderResponse.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/OrderResponse.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderResponse.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrderStatusResponse.java diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java b/patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java similarity index 100% rename from axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java rename to patterns-modules/axon/src/main/java/com/baeldung/axon/querymodel/OrdersEventHandler.java diff --git a/axon/src/main/resources/application-mongo.properties b/patterns-modules/axon/src/main/resources/application-mongo.properties similarity index 100% rename from axon/src/main/resources/application-mongo.properties rename to patterns-modules/axon/src/main/resources/application-mongo.properties diff --git a/axon/src/main/resources/application.properties b/patterns-modules/axon/src/main/resources/application.properties similarity index 100% rename from axon/src/main/resources/application.properties rename to patterns-modules/axon/src/main/resources/application.properties diff --git a/axon/src/main/resources/logback.xml b/patterns-modules/axon/src/main/resources/logback.xml similarity index 100% rename from axon/src/main/resources/logback.xml rename to patterns-modules/axon/src/main/resources/logback.xml diff --git a/axon/src/main/resources/order-api.http b/patterns-modules/axon/src/main/resources/order-api.http similarity index 100% rename from axon/src/main/resources/order-api.http rename to patterns-modules/axon/src/main/resources/order-api.http diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java diff --git a/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/gui/OrderRestEndpointManualTest.java diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/AbstractOrdersEventHandlerUnitTest.java diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandlerUnitTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandlerUnitTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandlerUnitTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/InMemoryOrdersEventHandlerUnitTest.java diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/MongoOrdersEventHandlerUnitTest.java diff --git a/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java b/patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java similarity index 100% rename from axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java rename to patterns-modules/axon/src/test/java/com/baeldung/axon/querymodel/OrderQueryServiceIntegrationTest.java diff --git a/axon/src/test/resources/application.properties b/patterns-modules/axon/src/test/resources/application.properties similarity index 100% rename from axon/src/test/resources/application.properties rename to patterns-modules/axon/src/test/resources/application.properties diff --git a/axon/start_axon_server.sh b/patterns-modules/axon/start_axon_server.sh old mode 100755 new mode 100644 similarity index 100% rename from axon/start_axon_server.sh rename to patterns-modules/axon/start_axon_server.sh diff --git a/axon/start_mongo.sh b/patterns-modules/axon/start_mongo.sh old mode 100755 new mode 100644 similarity index 100% rename from axon/start_mongo.sh rename to patterns-modules/axon/start_mongo.sh diff --git a/ddd-contexts/README.md b/patterns-modules/ddd-contexts/README.md similarity index 100% rename from ddd-contexts/README.md rename to patterns-modules/ddd-contexts/README.md diff --git a/ddd-contexts/ddd-contexts-infrastructure/pom.xml b/patterns-modules/ddd-contexts/ddd-contexts-infrastructure/pom.xml similarity index 100% rename from ddd-contexts/ddd-contexts-infrastructure/pom.xml rename to patterns-modules/ddd-contexts/ddd-contexts-infrastructure/pom.xml diff --git a/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java b/patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java similarity index 100% rename from ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java rename to patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/db/InMemoryOrderStore.java diff --git a/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java b/patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java similarity index 100% rename from ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java rename to patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/com/baeldung/dddcontexts/infrastructure/events/SimpleEventBus.java diff --git a/ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java b/patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java rename to patterns-modules/ddd-contexts/ddd-contexts-infrastructure/src/main/java/module-info.java diff --git a/ddd-contexts/ddd-contexts-mainapp/pom.xml b/patterns-modules/ddd-contexts/ddd-contexts-mainapp/pom.xml similarity index 100% rename from ddd-contexts/ddd-contexts-mainapp/pom.xml rename to patterns-modules/ddd-contexts/ddd-contexts-mainapp/pom.xml diff --git a/ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java b/patterns-modules/ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java similarity index 100% rename from ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java rename to patterns-modules/ddd-contexts/ddd-contexts-mainapp/src/main/java/com/baeldung/dddcontexts/mainapp/Application.java diff --git a/ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java b/patterns-modules/ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java rename to patterns-modules/ddd-contexts/ddd-contexts-mainapp/src/main/java/module-info.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/pom.xml b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/pom.xml similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/pom.xml rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/pom.xml diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/CustomerOrder.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/model/OrderItem.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/repository/CustomerOrderRepository.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/CustomerOrderService.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/com/baeldung/dddcontexts/ordercontext/service/OrderService.java diff --git a/ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java b/patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java rename to patterns-modules/ddd-contexts/ddd-contexts-ordercontext/src/main/java/module-info.java diff --git a/ddd-contexts/ddd-contexts-sharedkernel/pom.xml b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/pom.xml similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/pom.xml rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/pom.xml diff --git a/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/ApplicationEvent.java diff --git a/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventBus.java diff --git a/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/events/EventSubscriber.java diff --git a/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/com/baeldung/dddcontexts/sharedkernel/service/ApplicationService.java diff --git a/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java b/patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java rename to patterns-modules/ddd-contexts/ddd-contexts-sharedkernel/src/main/java/module-info.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/pom.xml b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/pom.xml similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/pom.xml rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/pom.xml diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/PackageItem.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/Parcel.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/model/ShippableOrder.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/repository/ShippingOrderRepository.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ParcelShippingService.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/com/baeldung/dddcontexts/shippingcontext/service/ShippingService.java diff --git a/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java b/patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java similarity index 100% rename from ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java rename to patterns-modules/ddd-contexts/ddd-contexts-shippingcontext/src/main/java/module-info.java diff --git a/ddd-contexts/pom.xml b/patterns-modules/ddd-contexts/pom.xml similarity index 97% rename from ddd-contexts/pom.xml rename to patterns-modules/ddd-contexts/pom.xml index 961a1d1624..f43581b0c8 100644 --- a/ddd-contexts/pom.xml +++ b/patterns-modules/ddd-contexts/pom.xml @@ -11,7 +11,7 @@ com.baeldung - parent-modules + patterns-modules 1.0.0-SNAPSHOT diff --git a/ddd/README.md b/patterns-modules/ddd/README.md similarity index 100% rename from ddd/README.md rename to patterns-modules/ddd/README.md diff --git a/ddd/pom.xml b/patterns-modules/ddd/pom.xml similarity index 98% rename from ddd/pom.xml rename to patterns-modules/ddd/pom.xml index 443b2b5148..80147c29c6 100644 --- a/ddd/pom.xml +++ b/patterns-modules/ddd/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2 + ../../parent-boot-2 diff --git a/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java similarity index 96% rename from ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java index 3a52fd0440..2d671ff85e 100644 --- a/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java @@ -1,12 +1,12 @@ -package com.baeldung.ddd; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication(scanBasePackages = "com.baeldung.ddd.order") -public class PersistingDddAggregatesApplication { - - public static void main(String[] args) { - SpringApplication.run(PersistingDddAggregatesApplication.class, args); - } -} +package com.baeldung.ddd; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung.ddd.order") +public class PersistingDddAggregatesApplication { + + public static void main(String[] args) { + SpringApplication.run(PersistingDddAggregatesApplication.class, args); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/order/Order.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/Order.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/Order.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/Order.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/OrderLine.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/Product.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/Product.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/Product.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/Product.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/config/CustomMongoConfiguration.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/AmountBasedDiscountPolicy.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/AmountBasedDiscountPolicy.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/AmountBasedDiscountPolicy.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/AmountBasedDiscountPolicy.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/DiscountPolicy.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/DiscountPolicy.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/DiscountPolicy.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/DiscountPolicy.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/FlatDiscountPolicy.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/FlatDiscountPolicy.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/FlatDiscountPolicy.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/FlatDiscountPolicy.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/Order.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/Order.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/Order.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/Order.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialDiscountPolicy.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialDiscountPolicy.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialDiscountPolicy.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialDiscountPolicy.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialOrder.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialOrder.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialOrder.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/SpecialOrder.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/HtmlOrderViewCreator.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/HtmlOrderViewCreator.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/HtmlOrderViewCreator.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/HtmlOrderViewCreator.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/OrderVisitor.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/OrderVisitor.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/OrderVisitor.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/OrderVisitor.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/Visitable.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/Visitable.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/Visitable.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/doubledispatch/visitor/Visitable.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderRepository.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java diff --git a/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/mongo/OrderMongoRepository.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/cli/CliOrderController.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/cli/CliOrderController.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/application/cli/CliOrderController.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/cli/CliOrderController.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/rest/OrderController.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/rest/OrderController.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/application/rest/OrderController.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/rest/OrderController.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/CassandraConfiguration.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/CassandraConfiguration.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/CassandraConfiguration.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/CassandraConfiguration.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/CassandraDbOrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/CassandraDbOrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/CassandraDbOrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/CassandraDbOrderRepository.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderEntity.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderEntity.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderEntity.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderEntity.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderItemEntity.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderItemEntity.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderItemEntity.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/OrderItemEntity.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/SpringDataCassandraOrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/SpringDataCassandraOrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/SpringDataCassandraOrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/cassandra/SpringDataCassandraOrderRepository.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/MongoDbOrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/MongoDbOrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/MongoDbOrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/MongoDbOrderRepository.java diff --git a/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/SpringDataMongoOrderRepository.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/SpringDataMongoOrderRepository.java similarity index 100% rename from ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/SpringDataMongoOrderRepository.java rename to patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/mongo/SpringDataMongoOrderRepository.java diff --git a/ddd/src/main/resources/ddd-layers.properties b/patterns-modules/ddd/src/main/resources/ddd-layers.properties similarity index 100% rename from ddd/src/main/resources/ddd-layers.properties rename to patterns-modules/ddd/src/main/resources/ddd-layers.properties diff --git a/ddd/src/test/java/com/baeldung/ddd/order/OrderFixtureUtils.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/OrderFixtureUtils.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/OrderFixtureUtils.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/OrderFixtureUtils.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/OrderUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/DoubleDispatchDiscountPolicyUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/DoubleDispatchDiscountPolicyUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/DoubleDispatchDiscountPolicyUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/DoubleDispatchDiscountPolicyUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/HtmlOrderViewCreatorUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/HtmlOrderViewCreatorUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/HtmlOrderViewCreatorUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/HtmlOrderViewCreatorUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/MethodOverloadExampleUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/MethodOverloadExampleUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/MethodOverloadExampleUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/MethodOverloadExampleUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/SingleDispatchDiscountPolicyUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/SingleDispatchDiscountPolicyUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/SingleDispatchDiscountPolicyUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/doubledispatch/SingleDispatchDiscountPolicyUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/jpa/PersistOrderLiveTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/jpa/ViolateOrderBusinessRulesUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/ddd/order/mongo/OrderMongoLiveTest.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepositoryLiveTest.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryLiveTest.java diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java b/patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java similarity index 100% rename from ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java rename to patterns-modules/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md b/patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md similarity index 100% rename from ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md rename to patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/cassandra-init.cql b/patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/cassandra-init.cql similarity index 100% rename from ddd/src/test/resources/com/baeldung/dddhexagonalspring/cassandra-init.cql rename to patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/cassandra-init.cql diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml b/patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml similarity index 100% rename from ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml rename to patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js b/patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js similarity index 100% rename from ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js rename to patterns-modules/ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js diff --git a/ddd/src/test/resources/ddd-layers-test.properties b/patterns-modules/ddd/src/test/resources/ddd-layers-test.properties similarity index 100% rename from ddd/src/test/resources/ddd-layers-test.properties rename to patterns-modules/ddd/src/test/resources/ddd-layers-test.properties diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index add2b0475b..7dd26ac31c 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -14,6 +14,12 @@ + axon + clean-architecture + coupling + cqrs-es + ddd + ddd-contexts design-patterns-architectural design-patterns-behavioral design-patterns-behavioral-2 @@ -24,14 +30,11 @@ design-patterns-singleton design-patterns-structural dip - cqrs-es + enterprise-patterns front-controller + idd intercepting-filter solid - clean-architecture - enterprise-patterns - coupling - idd diff --git a/pom.xml b/pom.xml index 327d83017f..a5abb59502 100644 --- a/pom.xml +++ b/pom.xml @@ -771,7 +771,6 @@ core-java-modules custom-pmd data-structures - ddd-contexts jackson-modules jmh deeplearning4j @@ -821,11 +820,8 @@ atomikos atomix - axon - bazel google-auto-project - ddd disruptor dozer dubbo @@ -1057,7 +1053,6 @@ spring-aop-2 custom-pmd data-structures - ddd-contexts jackson-modules jmh deeplearning4j @@ -1107,11 +1102,8 @@ atomikos atomix - axon - bazel google-auto-project - ddd disruptor dozer From 520b679733d06d32a7fd9792c9e3519924f0be98 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 27 Oct 2023 17:04:45 +0530 Subject: [PATCH 250/831] JAVA-26393 Move couchbase to persistence-modules (#15059) --- {couchbase => persistence-modules/couchbase}/.gitignore | 0 {couchbase => persistence-modules/couchbase}/README.md | 0 {couchbase => persistence-modules/couchbase}/mvnw | 0 {couchbase => persistence-modules/couchbase}/mvnw.cmd | 0 {couchbase => persistence-modules/couchbase}/pom.xml | 2 +- .../java/com/baeldung/couchbase/async/CouchbaseEntity.java | 0 .../main/java/com/baeldung/couchbase/async/person/Person.java | 0 .../baeldung/couchbase/async/person/PersonCrudService.java | 0 .../couchbase/async/person/PersonDocumentConverter.java | 0 .../baeldung/couchbase/async/person/RegistrationService.java | 0 .../couchbase/async/service/AbstractBucketService.java | 0 .../baeldung/couchbase/async/service/AbstractCrudService.java | 0 .../com/baeldung/couchbase/async/service/BucketService.java | 0 .../com/baeldung/couchbase/async/service/ClusterService.java | 0 .../baeldung/couchbase/async/service/ClusterServiceImpl.java | 0 .../com/baeldung/couchbase/async/service/CrudService.java | 0 .../couchbase/async/service/JsonDocumentConverter.java | 0 .../couchbase/async/service/TutorialBucketService.java | 0 .../main/java/com/baeldung/couchbase/intro/CodeSnippets.java | 0 .../baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java | 0 .../baeldung/couchbase/mapreduce/DuplicateKeyException.java | 0 .../com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java | 0 .../java/com/baeldung/couchbase/mapreduce/StudentGrade.java | 0 .../couchbase/mapreduce/StudentGradeKeyGenerator.java | 0 .../couchbase/mapreduce/StudentGradeQueryBuilder.java | 0 .../com/baeldung/couchbase/mapreduce/StudentGradeService.java | 0 .../main/java/com/baeldung/couchbase/n1ql/BucketFactory.java | 0 .../main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java | 0 .../java/com/baeldung/couchbase/spring/person/Person.java | 0 .../baeldung/couchbase/spring/person/PersonCrudService.java | 0 .../couchbase/spring/person/PersonDocumentConverter.java | 0 .../baeldung/couchbase/spring/person/RegistrationService.java | 0 .../com/baeldung/couchbase/spring/service/BucketService.java | 0 .../com/baeldung/couchbase/spring/service/ClusterService.java | 0 .../baeldung/couchbase/spring/service/ClusterServiceImpl.java | 0 .../com/baeldung/couchbase/spring/service/CrudService.java | 0 .../couchbase/spring/service/JsonDocumentConverter.java | 0 .../couchbase/spring/service/TutorialBucketService.java | 0 .../couchbase}/src/main/resources/application.properties | 0 .../couchbase}/src/main/resources/logback.xml | 0 .../com/baeldung/couchbase/async/AsyncIntegrationTest.java | 0 .../baeldung/couchbase/async/AsyncIntegrationTestConfig.java | 0 .../async/person/PersonCrudServiceIntegrationTestConfig.java | 0 .../couchbase/async/person/PersonCrudServiceLiveTest.java | 0 .../couchbase/async/service/ClusterServiceLiveTest.java | 0 .../couchbase/mapreduce/StudentGradeServiceLiveTest.java | 0 .../com/baeldung/couchbase/n1ql/IntegrationTestConfig.java | 0 .../test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java | 0 .../java/com/baeldung/couchbase/spring/IntegrationTest.java | 0 .../com/baeldung/couchbase/spring/IntegrationTestConfig.java | 0 .../couchbase/spring/person/PersonCrudServiceLiveTest.java | 0 .../couchbase/spring/service/ClusterServiceLiveTest.java | 0 .../couchbase}/src/test/resources/logback.xml | 0 persistence-modules/pom.xml | 1 + pom.xml | 4 +--- 55 files changed, 3 insertions(+), 4 deletions(-) rename {couchbase => persistence-modules/couchbase}/.gitignore (100%) rename {couchbase => persistence-modules/couchbase}/README.md (100%) rename {couchbase => persistence-modules/couchbase}/mvnw (100%) rename {couchbase => persistence-modules/couchbase}/mvnw.cmd (100%) rename {couchbase => persistence-modules/couchbase}/pom.xml (97%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/person/Person.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/BucketService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/CrudService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/person/Person.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java (100%) rename {couchbase => persistence-modules/couchbase}/src/main/resources/application.properties (100%) rename {couchbase => persistence-modules/couchbase}/src/main/resources/logback.xml (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTestConfig.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceLiveTest.java (100%) rename {couchbase => persistence-modules/couchbase}/src/test/resources/logback.xml (100%) diff --git a/couchbase/.gitignore b/persistence-modules/couchbase/.gitignore similarity index 100% rename from couchbase/.gitignore rename to persistence-modules/couchbase/.gitignore diff --git a/couchbase/README.md b/persistence-modules/couchbase/README.md similarity index 100% rename from couchbase/README.md rename to persistence-modules/couchbase/README.md diff --git a/couchbase/mvnw b/persistence-modules/couchbase/mvnw similarity index 100% rename from couchbase/mvnw rename to persistence-modules/couchbase/mvnw diff --git a/couchbase/mvnw.cmd b/persistence-modules/couchbase/mvnw.cmd similarity index 100% rename from couchbase/mvnw.cmd rename to persistence-modules/couchbase/mvnw.cmd diff --git a/couchbase/pom.xml b/persistence-modules/couchbase/pom.xml similarity index 97% rename from couchbase/pom.xml rename to persistence-modules/couchbase/pom.xml index 823b33ee29..b98c0cc387 100644 --- a/couchbase/pom.xml +++ b/persistence-modules/couchbase/pom.xml @@ -10,7 +10,7 @@ com.baeldung - parent-modules + persistence-modules 1.0.0-SNAPSHOT diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/CouchbaseEntity.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/Person.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonCrudService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/PersonDocumentConverter.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/person/RegistrationService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractBucketService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/AbstractCrudService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/BucketService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/ClusterServiceImpl.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/CrudService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/JsonDocumentConverter.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/async/service/TutorialBucketService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/intro/CodeSnippets.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/CouchbaseKeyGenerator.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/DuplicateKeyException.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/RandomUUIDGenerator.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGrade.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeKeyGenerator.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeQueryBuilder.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/mapreduce/StudentGradeService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/n1ql/BucketFactory.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/n1ql/CodeSnippets.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/Person.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonCrudService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/PersonDocumentConverter.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/person/RegistrationService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/BucketService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/ClusterServiceImpl.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/CrudService.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/JsonDocumentConverter.java diff --git a/couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java b/persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java similarity index 100% rename from couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java rename to persistence-modules/couchbase/src/main/java/com/baeldung/couchbase/spring/service/TutorialBucketService.java diff --git a/couchbase/src/main/resources/application.properties b/persistence-modules/couchbase/src/main/resources/application.properties similarity index 100% rename from couchbase/src/main/resources/application.properties rename to persistence-modules/couchbase/src/main/resources/application.properties diff --git a/couchbase/src/main/resources/logback.xml b/persistence-modules/couchbase/src/main/resources/logback.xml similarity index 100% rename from couchbase/src/main/resources/logback.xml rename to persistence-modules/couchbase/src/main/resources/logback.xml diff --git a/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/AsyncIntegrationTestConfig.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTestConfig.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTestConfig.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTestConfig.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceIntegrationTestConfig.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/person/PersonCrudServiceLiveTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/async/service/ClusterServiceLiveTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/mapreduce/StudentGradeServiceLiveTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/n1ql/IntegrationTestConfig.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/n1ql/N1QLLiveTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/IntegrationTestConfig.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/person/PersonCrudServiceLiveTest.java diff --git a/couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceLiveTest.java b/persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceLiveTest.java similarity index 100% rename from couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceLiveTest.java rename to persistence-modules/couchbase/src/test/java/com/baeldung/couchbase/spring/service/ClusterServiceLiveTest.java diff --git a/couchbase/src/test/resources/logback.xml b/persistence-modules/couchbase/src/test/resources/logback.xml similarity index 100% rename from couchbase/src/test/resources/logback.xml rename to persistence-modules/couchbase/src/test/resources/logback.xml diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index a99a180390..53e408c3a5 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -21,6 +21,7 @@ blaze-persistence core-java-persistence core-java-persistence-2 + couchbase elasticsearch flyway flyway-repair diff --git a/pom.xml b/pom.xml index a5abb59502..17a914d619 100644 --- a/pom.xml +++ b/pom.xml @@ -765,7 +765,6 @@ aws-modules checker-framework - couchbase core-groovy-modules core-java-modules @@ -1035,8 +1034,7 @@ aws-modules checker-framework - couchbase - + core-groovy-modules core-java-modules From ce6640a476d145fe54b2ebb39c01e184e8544e8e Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Fri, 27 Oct 2023 18:42:59 +0200 Subject: [PATCH 251/831] Java-24346: Fix integration test for spring-cloud-contract-consumer module --- .../BasicMathControllerIntegrationTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java index e21223e6ea..c19b3f3694 100644 --- a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java @@ -1,5 +1,10 @@ package com.baeldung.spring.cloud.springcloudcontractconsumer.controller; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +18,7 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -26,6 +32,36 @@ public class BasicMathControllerIntegrationTest { @Autowired private MockMvc mockMvc; + private static WireMockServer wireMockServer; + + + @BeforeClass + public static void setupClass() { + WireMockConfiguration wireMockConfiguration = WireMockConfiguration.options().port(8090); // Use the same port as in your code + + wireMockServer = new WireMockServer(wireMockConfiguration); + wireMockServer.start(); + } + + @AfterClass + public static void teardownClass() { + wireMockServer.stop(); + } + + @Before + public void setup() { + wireMockServer.stubFor(get(urlEqualTo("/validate/prime-number?number=1")) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("Odd"))); + + wireMockServer.stubFor(get(urlEqualTo("/validate/prime-number?number=2")) + .willReturn(aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody("Even"))); + } @Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven() throws Exception { From 3c8d10dd828178d786a7dcb978991c7688913006 Mon Sep 17 00:00:00 2001 From: Anton Dalagan Date: Fri, 27 Oct 2023 18:44:07 +0200 Subject: [PATCH 252/831] Bael 7146 improvement to this article convert double to float in java (#15067) * Commit 1 - Anton Dalagan Code for Evaluation article. Contains Unit tests, domain class, and App main method. * BAEL-7146 Updated the unit test to display the results of the conversion. This will be explained in the article itself. * BAEL-7146 cleaned up pR --- .../FloatDoubleConversionsTest.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java index 9c6b01e9de..9da50276a9 100644 --- a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java @@ -7,23 +7,27 @@ public class FloatDoubleConversionsTest { @Test public void whenDoubleType_thenFloatTypeSuccess(){ - double interestRatesYearly = 13.333333333333334; + double interestRatesYearly = 13.333333333333333; float interest = (float) interestRatesYearly; - Assert.assertEquals(13.333333f, interest, 0.000004f); + System.out.println(interest); //13.333333 + Assert.assertEquals(13.333333f, interest, 0.000001f); - Double monthlyRates = 2.111111111111112; + Double monthlyRates = 2.111111111111111; float rates = monthlyRates.floatValue(); - Assert.assertEquals(2.1111112f, rates, 0.00000013); + System.out.println(rates); //2.1111112 + Assert.assertEquals(2.1111111f, rates, 0.0000001f); } @Test public void whenFloatType_thenDoubleTypeSuccess(){ float gradeAverage =2.05f; double average = gradeAverage; - Assert.assertEquals(2.05, average, 0.06); + System.out.println(average); //2.049999952316284 + Assert.assertEquals(2.05, average, 0.01); - Float monthlyRates = 2.1111112f; + Float monthlyRates = 2.1111111f; Double rates = monthlyRates.doubleValue(); - Assert.assertEquals(2.11111112, rates, 0.0000002);//true + System.out.println(rates); //2.1111111640930176 + Assert.assertEquals(2.11111111, rates, 0.0000001);//true } } From 65411d9deec5338b3a2f9f9425649432c5d27fa2 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Fri, 27 Oct 2023 18:49:21 +0200 Subject: [PATCH 253/831] This commit is related to the article BAEL-7084 (#15070) This commit aims to add a test class "XMLStringToDocumentObjectUnitTest.java" that provides a test method to convert XML string into a Document object in Java. --- .../XMLStringToDocumentObjectUnitTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 xml-2/src/test/java/com/baeldung/xml/xml2document/XMLStringToDocumentObjectUnitTest.java diff --git a/xml-2/src/test/java/com/baeldung/xml/xml2document/XMLStringToDocumentObjectUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/xml2document/XMLStringToDocumentObjectUnitTest.java new file mode 100644 index 0000000000..f573e1c96d --- /dev/null +++ b/xml-2/src/test/java/com/baeldung/xml/xml2document/XMLStringToDocumentObjectUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.xml2document; + +import org.junit.Test; +import org.w3c.dom.*; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import java.io.IOException; +import java.io.StringReader; + +import static org.junit.Assert.assertEquals; + +public class XMLStringToDocumentObjectUnitTest { + @Test + public void givenValidXMLString_whenParsing_thenDocumentIsCorrect() throws ParserConfigurationException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + String xmlString = "XML Parsing Example"; + InputSource is = new InputSource(new StringReader(xmlString)); + Document xmlDoc = null; + try { + xmlDoc = builder.parse(is); + } catch (SAXException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + + assertEquals("root", xmlDoc.getDocumentElement().getNodeName()); + assertEquals("element", xmlDoc.getDocumentElement().getElementsByTagName("element").item(0).getNodeName()); + assertEquals("XML Parsing Example", xmlDoc.getDocumentElement().getElementsByTagName("element").item(0).getTextContent()); + } +} From 0abadb03a59827d3382e521832e75ab3a0f8d8a3 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 27 Oct 2023 22:42:27 +0530 Subject: [PATCH 254/831] JAVA-26281 Improve spring-activi module build time --- ...tiWithSpringApplicationIntegrationTest.java | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java diff --git a/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java deleted file mode 100644 index d289693a73..0000000000 --- a/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.activitiwithspring; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = ActivitiWithSpringApplication.class) -@AutoConfigureTestDatabase -public class ActivitiWithSpringApplicationIntegrationTest { - - @Test - public void contextLoads() { - } - -} From bb9a96d9b36c5806a0ace5042d3f9df50e6c6673 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 27 Oct 2023 22:48:52 +0530 Subject: [PATCH 255/831] JAVA-26380 Change parent of spring-security-modules- Check build failures --- spring-security-modules/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index ed8279c5f7..1b3db18b84 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -10,8 +10,9 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 From 6341e1844fd923825423c9cf445b3cf54f6bc154 Mon Sep 17 00:00:00 2001 From: Constantin <50400363+constantinurs@users.noreply.github.com> Date: Fri, 27 Oct 2023 21:31:28 +0300 Subject: [PATCH 256/831] BAEL-6769: Override Cucumber option values (#15078) --- spring-cucumber/pom.xml | 9 ++++- .../CucumberOptionsApplication.java | 13 +++++++ .../HealthCheckController.java | 22 +++++++++++ .../HealthCheckStepDefsIntegrationTest.java | 38 +++++++++++++++++++ .../cucumberoptions/healthcheck.feature | 11 ++++++ .../src/test/resources/cucumber.properties | 1 + 6 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 spring-cucumber/src/main/java/com/baeldung/cucumberoptions/CucumberOptionsApplication.java create mode 100644 spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java create mode 100644 spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java create mode 100644 spring-cucumber/src/test/resources/com/baeldung/cucumberoptions/healthcheck.feature create mode 100644 spring-cucumber/src/test/resources/cucumber.properties diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index c6c163d7d1..042e81971f 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -45,6 +45,12 @@ ${cucumber.version} test + + org.junit.vintage + junit-vintage-engine + ${junit-vintage-engine.version} + test + org.apache.commons @@ -54,8 +60,9 @@ - 6.8.0 + 7.14.0 1.3.2 + 5.10.0 \ No newline at end of file diff --git a/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/CucumberOptionsApplication.java b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/CucumberOptionsApplication.java new file mode 100644 index 0000000000..03082128b3 --- /dev/null +++ b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/CucumberOptionsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.cucumberoptions; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CucumberOptionsApplication { + + public static void main(String[] args) { + SpringApplication.run(CucumberOptionsApplication.class, args); + } + +} \ No newline at end of file diff --git a/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java new file mode 100644 index 0000000000..637dbdb540 --- /dev/null +++ b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java @@ -0,0 +1,22 @@ +package com.baeldung.cucumberoptions; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HealthCheckController { + + @GetMapping(path = "/v1/status", produces = APPLICATION_JSON_VALUE) + public HttpStatus getV1Status() { + return ResponseEntity.ok().build().getStatusCode(); + } + + @GetMapping(path = "/v2/status", produces = APPLICATION_JSON_VALUE) + public HttpStatus getV2Status() { + return ResponseEntity.ok().build().getStatusCode(); + } +} \ No newline at end of file diff --git a/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java b/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java new file mode 100644 index 0000000000..999adadbef --- /dev/null +++ b/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung.cucumberoptions; + +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import com.baeldung.SpringIntegrationTest; + +public class HealthCheckStepDefsIntegrationTest extends SpringIntegrationTest { + + private ResponseEntity statusResponse; + + private ResponseEntity doGet(String url) { + return new RestTemplate().getForEntity(url, String.class); + } + + @When("^the client calls /v1/status") + public void checkV1Status() throws Throwable { + statusResponse = doGet("http://localhost:8082/v1/status"); + } + + @When("^the client calls /v2/status") + public void checkV2Status() throws Throwable { + statusResponse = doGet("http://localhost:8082/v2/status"); + } + + @Then("^the client receives (\\d+) status code$") + public void verifyStatusCode(int statusCode) throws Throwable { + final HttpStatus currentStatusCode = statusResponse.getStatusCode(); + assertThat(currentStatusCode.value(), is(statusCode)); + } +} \ No newline at end of file diff --git a/spring-cucumber/src/test/resources/com/baeldung/cucumberoptions/healthcheck.feature b/spring-cucumber/src/test/resources/com/baeldung/cucumberoptions/healthcheck.feature new file mode 100644 index 0000000000..33e07c1add --- /dev/null +++ b/spring-cucumber/src/test/resources/com/baeldung/cucumberoptions/healthcheck.feature @@ -0,0 +1,11 @@ +Feature: healthcheck endpoints can be verified + + @v1 + Scenario: v1 status is healthy + When the client calls /v1/status + Then the client receives 200 status code + + @v2 + Scenario: v2 status is healthy + When the client calls /v2/status + Then the client receives 200 status code diff --git a/spring-cucumber/src/test/resources/cucumber.properties b/spring-cucumber/src/test/resources/cucumber.properties new file mode 100644 index 0000000000..22c3379201 --- /dev/null +++ b/spring-cucumber/src/test/resources/cucumber.properties @@ -0,0 +1 @@ +cucumber.filter.tags=not @v2 \ No newline at end of file From dc6b248d9d31785226c255dc6f96495b2eb34e61 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 28 Oct 2023 12:26:06 +0530 Subject: [PATCH 257/831] JAVA-26280 Improve libraries-testing module build time --- libraries-testing/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 2c7f231fdc..8db9e4e5c5 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -213,7 +213,7 @@ 1.9.9 1.46.0 1.9.0 - 3.6.12 + 4.0.18 1.5.0 3.0.0 0.8.1 From 2db8c97c1f338b2a5257baea7e9e73cf6d5197b0 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Sat, 28 Oct 2023 12:45:52 +0530 Subject: [PATCH 258/831] JAVA-25111: Changes made for reoving duplicate module (#15076) --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 17a914d619..07b9d6d842 100644 --- a/pom.xml +++ b/pom.xml @@ -1211,7 +1211,6 @@ gradle-modules/gradle/maven-to-gradle persistence-modules/spring-data-neo4j spring-actuator - gcp-firebase spring-di-4 spring-kafka-2 From 235cba0dbd10cf7579002b2156535b54965bab88 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 28 Oct 2023 13:08:15 +0530 Subject: [PATCH 259/831] updated backlink --- core-java-modules/core-java-8/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md index 6061f3318d..0921c1538a 100644 --- a/core-java-modules/core-java-8/README.md +++ b/core-java-modules/core-java-8/README.md @@ -11,5 +11,5 @@ This module contains articles about Java 8 core features - [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max) - [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization) - [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference) -- [Monads in Java](https://www.baeldung.com/java-monads) +- [Monads in Java – Optional](https://www.baeldung.com/java-monads) - [[More -->]](/core-java-modules/core-java-8-2) From 246d83d49d6790be372681ef3233ff567b02334b Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 28 Oct 2023 13:19:47 +0530 Subject: [PATCH 260/831] JAVA-26380 Update parent of child modules to use immediate parent --- spring-security-modules/spring-security-acl/pom.xml | 3 +-- spring-security-modules/spring-security-auth0/pom.xml | 3 +-- spring-security-modules/spring-security-azuread/pom.xml | 3 +-- spring-security-modules/spring-security-cognito/pom.xml | 3 +-- spring-security-modules/spring-security-core-2/pom.xml | 3 +-- spring-security-modules/spring-security-core/pom.xml | 3 +-- spring-security-modules/spring-security-ldap/pom.xml | 3 +-- spring-security-modules/spring-security-legacy-oidc/pom.xml | 3 +-- spring-security-modules/spring-security-oauth2-sso/pom.xml | 3 +-- spring-security-modules/spring-security-oauth2/pom.xml | 3 +-- spring-security-modules/spring-security-oidc/pom.xml | 3 +-- spring-security-modules/spring-security-okta/pom.xml | 3 +-- spring-security-modules/spring-security-opa/pom.xml | 3 +-- spring-security-modules/spring-security-pkce/pom.xml | 3 +-- spring-security-modules/spring-security-saml/pom.xml | 3 +-- spring-security-modules/spring-security-social-login/pom.xml | 3 +-- spring-security-modules/spring-security-web-angular/pom.xml | 3 +-- spring-security-modules/spring-security-web-boot-1/pom.xml | 3 +-- spring-security-modules/spring-security-web-boot-2/pom.xml | 3 +-- spring-security-modules/spring-security-web-boot-3/pom.xml | 3 +-- spring-security-modules/spring-security-web-boot-4/pom.xml | 3 +-- spring-security-modules/spring-security-web-boot-5/pom.xml | 3 +-- spring-security-modules/spring-security-web-login-2/pom.xml | 3 +-- spring-security-modules/spring-security-web-mvc/pom.xml | 3 +-- .../spring-security-web-rest-basic-auth/pom.xml | 3 +-- .../spring-security-web-rest-custom/pom.xml | 3 +-- spring-security-modules/spring-security-web-springdoc/pom.xml | 3 +-- spring-security-modules/spring-security-web-thymeleaf/pom.xml | 3 +-- spring-security-modules/spring-security-web-x509/pom.xml | 3 +-- 29 files changed, 29 insertions(+), 58 deletions(-) diff --git a/spring-security-modules/spring-security-acl/pom.xml b/spring-security-modules/spring-security-acl/pom.xml index 7facc1b14b..734b85800a 100644 --- a/spring-security-modules/spring-security-acl/pom.xml +++ b/spring-security-modules/spring-security-acl/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-auth0/pom.xml b/spring-security-modules/spring-security-auth0/pom.xml index 106a0db29f..8ee59eeac1 100644 --- a/spring-security-modules/spring-security-auth0/pom.xml +++ b/spring-security-modules/spring-security-auth0/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml index c1fe08b47a..7e67a7e635 100644 --- a/spring-security-modules/spring-security-azuread/pom.xml +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -6,9 +6,8 @@ 4.0.0 com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 spring-security-azuread diff --git a/spring-security-modules/spring-security-cognito/pom.xml b/spring-security-modules/spring-security-cognito/pom.xml index 56754ddf99..2e359382a7 100644 --- a/spring-security-modules/spring-security-cognito/pom.xml +++ b/spring-security-modules/spring-security-cognito/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-core-2/pom.xml b/spring-security-modules/spring-security-core-2/pom.xml index 5d77098869..54aac0d9a7 100644 --- a/spring-security-modules/spring-security-core-2/pom.xml +++ b/spring-security-modules/spring-security-core-2/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-core/pom.xml b/spring-security-modules/spring-security-core/pom.xml index 03d7030057..2a18145ac0 100644 --- a/spring-security-modules/spring-security-core/pom.xml +++ b/spring-security-modules/spring-security-core/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml index 471ffff4a1..9f4f3b4106 100644 --- a/spring-security-modules/spring-security-ldap/pom.xml +++ b/spring-security-modules/spring-security-ldap/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-legacy-oidc/pom.xml b/spring-security-modules/spring-security-legacy-oidc/pom.xml index e98486b0ff..55b6e780b2 100644 --- a/spring-security-modules/spring-security-legacy-oidc/pom.xml +++ b/spring-security-modules/spring-security-legacy-oidc/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-oauth2-sso/pom.xml b/spring-security-modules/spring-security-oauth2-sso/pom.xml index a87e4d7814..d8101d2313 100644 --- a/spring-security-modules/spring-security-oauth2-sso/pom.xml +++ b/spring-security-modules/spring-security-oauth2-sso/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-oauth2/pom.xml b/spring-security-modules/spring-security-oauth2/pom.xml index 1b30f6685d..977e2c16fd 100644 --- a/spring-security-modules/spring-security-oauth2/pom.xml +++ b/spring-security-modules/spring-security-oauth2/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-oidc/pom.xml b/spring-security-modules/spring-security-oidc/pom.xml index 70031b7396..c27c084ad7 100644 --- a/spring-security-modules/spring-security-oidc/pom.xml +++ b/spring-security-modules/spring-security-oidc/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-okta/pom.xml b/spring-security-modules/spring-security-okta/pom.xml index 98b8abedb4..5ae1241b18 100644 --- a/spring-security-modules/spring-security-okta/pom.xml +++ b/spring-security-modules/spring-security-okta/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml index 72b0574253..a6240f6e69 100644 --- a/spring-security-modules/spring-security-opa/pom.xml +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -7,9 +7,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-pkce/pom.xml b/spring-security-modules/spring-security-pkce/pom.xml index 5899b297b4..e0bd8eb90e 100644 --- a/spring-security-modules/spring-security-pkce/pom.xml +++ b/spring-security-modules/spring-security-pkce/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-saml/pom.xml b/spring-security-modules/spring-security-saml/pom.xml index 8a9b418374..8d7cce939f 100644 --- a/spring-security-modules/spring-security-saml/pom.xml +++ b/spring-security-modules/spring-security-saml/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-social-login/pom.xml b/spring-security-modules/spring-security-social-login/pom.xml index ddda4235be..5efa5b703c 100644 --- a/spring-security-modules/spring-security-social-login/pom.xml +++ b/spring-security-modules/spring-security-social-login/pom.xml @@ -9,9 +9,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-angular/pom.xml b/spring-security-modules/spring-security-web-angular/pom.xml index 2a745bc6cc..15dc4d007c 100644 --- a/spring-security-modules/spring-security-web-angular/pom.xml +++ b/spring-security-modules/spring-security-web-angular/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index fa0fd567fe..08adb700ec 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index 3ba8726f51..2255f8b035 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-2/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-boot-3/pom.xml b/spring-security-modules/spring-security-web-boot-3/pom.xml index 5229068dfa..0b71e89527 100644 --- a/spring-security-modules/spring-security-web-boot-3/pom.xml +++ b/spring-security-modules/spring-security-web-boot-3/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-boot-4/pom.xml b/spring-security-modules/spring-security-web-boot-4/pom.xml index ffbed0f8ab..b5bfc55a9f 100644 --- a/spring-security-modules/spring-security-web-boot-4/pom.xml +++ b/spring-security-modules/spring-security-web-boot-4/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-boot-5/pom.xml b/spring-security-modules/spring-security-web-boot-5/pom.xml index f4e2e3ad92..14b8d87f25 100644 --- a/spring-security-modules/spring-security-web-boot-5/pom.xml +++ b/spring-security-modules/spring-security-web-boot-5/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-login-2/pom.xml b/spring-security-modules/spring-security-web-login-2/pom.xml index 2d92a8567f..a44543a6ba 100644 --- a/spring-security-modules/spring-security-web-login-2/pom.xml +++ b/spring-security-modules/spring-security-web-login-2/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-mvc/pom.xml b/spring-security-modules/spring-security-web-mvc/pom.xml index 505826d1a2..10dd89f618 100644 --- a/spring-security-modules/spring-security-web-mvc/pom.xml +++ b/spring-security-modules/spring-security-web-mvc/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml index 3c842a8a54..9a3b21af92 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml +++ b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-rest-custom/pom.xml b/spring-security-modules/spring-security-web-rest-custom/pom.xml index dfd2f59aaf..2e55fe8b89 100644 --- a/spring-security-modules/spring-security-web-rest-custom/pom.xml +++ b/spring-security-modules/spring-security-web-rest-custom/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-springdoc/pom.xml b/spring-security-modules/spring-security-web-springdoc/pom.xml index 03e938f1c8..30102fd83d 100644 --- a/spring-security-modules/spring-security-web-springdoc/pom.xml +++ b/spring-security-modules/spring-security-web-springdoc/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-thymeleaf/pom.xml b/spring-security-modules/spring-security-web-thymeleaf/pom.xml index c13aa6a471..dd5f2d7c97 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/pom.xml +++ b/spring-security-modules/spring-security-web-thymeleaf/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-x509/pom.xml b/spring-security-modules/spring-security-web-x509/pom.xml index 5282ab7d83..ec0331fd53 100644 --- a/spring-security-modules/spring-security-web-x509/pom.xml +++ b/spring-security-modules/spring-security-web-x509/pom.xml @@ -10,9 +10,8 @@ com.baeldung - parent-boot-2 + spring-security-modules 0.0.1-SNAPSHOT - ../../parent-boot-2 From 30523bdc89d568c05999d074f994187e106370ad Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 28 Oct 2023 13:24:41 +0530 Subject: [PATCH 261/831] backlink removed --- aws-modules/aws-miscellaneous/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/aws-modules/aws-miscellaneous/README.md b/aws-modules/aws-miscellaneous/README.md index 5be8e6a3f2..104c8719df 100644 --- a/aws-modules/aws-miscellaneous/README.md +++ b/aws-modules/aws-miscellaneous/README.md @@ -5,6 +5,5 @@ This module contains articles about various Amazon Web Services (AWS) such as EC ### Relevant articles - [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java) -- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests) - [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java) - [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java) From 96b32de7ba49b06580c79efe00ac998d176f1aaf Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 28 Oct 2023 14:33:07 +0530 Subject: [PATCH 262/831] backlink added --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index 2dce44d217..7020369f02 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: +[How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) From 3042166f4bb63d2e542df96ca8aa67f4a1fafc1c Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 28 Oct 2023 14:39:02 +0530 Subject: [PATCH 263/831] readme created or backlink added --- core-java-modules/core-java-concurrency-advanced-5/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-5/README.md diff --git a/core-java-modules/core-java-concurrency-advanced-5/README.md b/core-java-modules/core-java-concurrency-advanced-5/README.md new file mode 100644 index 0000000000..ba845a7c4b --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/README.md @@ -0,0 +1,3 @@ + +### Relevant Articles: +- [Why wait() Requires Synchronization?](https://www.baeldung.com/java-wait-necessary-synchronization) From 462ddc7f0260f44d0dbd56789f55c09ea9c5cd88 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 28 Oct 2023 21:11:08 +0530 Subject: [PATCH 264/831] BAEL-7145 Bill Pugh Singleton implementation --- .../baledung/billpugh/BillPughSingleton.java | 15 ++++++ .../billpugh/EagerLoadedSingleton.java | 11 +++++ .../billpugh/LazyLoadedSingleton.java | 15 ++++++ .../SynchronizedLazyLoadedSingleton.java | 15 ++++++ .../billpugh/BillPughSingletonUnitTest.java | 43 +++++++++++++++++ .../EagerLoadedSingletonUnitTest.java | 46 +++++++++++++++++++ .../billpugh/LazyLoadedSingletonUnitTest.java | 17 +++++++ ...nchronizedLazyLoadedSingletonUnitTest.java | 44 ++++++++++++++++++ 8 files changed, 206 insertions(+) create mode 100644 patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/BillPughSingleton.java create mode 100644 patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/EagerLoadedSingleton.java create mode 100644 patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/LazyLoadedSingleton.java create mode 100644 patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/SynchronizedLazyLoadedSingleton.java create mode 100644 patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java create mode 100644 patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/EagerLoadedSingletonUnitTest.java create mode 100644 patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/LazyLoadedSingletonUnitTest.java create mode 100644 patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/SynchronizedLazyLoadedSingletonUnitTest.java diff --git a/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/BillPughSingleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/BillPughSingleton.java new file mode 100644 index 0000000000..f558706a07 --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/BillPughSingleton.java @@ -0,0 +1,15 @@ +package com.baledung.billpugh; + +public class BillPughSingleton { + private BillPughSingleton() { + + } + + private static class SingletonHelper { + private static final BillPughSingleton BILL_PUGH_SINGLETON_INSTANCE = new BillPughSingleton(); + } + + public static BillPughSingleton getInstance() { + return SingletonHelper.BILL_PUGH_SINGLETON_INSTANCE; + } +} diff --git a/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/EagerLoadedSingleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/EagerLoadedSingleton.java new file mode 100644 index 0000000000..c0a535f2d5 --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/EagerLoadedSingleton.java @@ -0,0 +1,11 @@ +package com.baledung.billpugh; + +public class EagerLoadedSingleton { + private static final EagerLoadedSingleton EAGER_LOADED_SINGLETON = new EagerLoadedSingleton(); + private EagerLoadedSingleton() { + + } + public static EagerLoadedSingleton getInstance() { + return EAGER_LOADED_SINGLETON; + } +} diff --git a/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/LazyLoadedSingleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/LazyLoadedSingleton.java new file mode 100644 index 0000000000..b4967a58cd --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/LazyLoadedSingleton.java @@ -0,0 +1,15 @@ +package com.baledung.billpugh; + +public class LazyLoadedSingleton { + private static LazyLoadedSingleton lazyLoadedSingletonObj; + + private LazyLoadedSingleton() { + } + + public static LazyLoadedSingleton getInstance() { + if (null == lazyLoadedSingletonObj) { + lazyLoadedSingletonObj = new LazyLoadedSingleton(); + } + return lazyLoadedSingletonObj; + } +} diff --git a/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/SynchronizedLazyLoadedSingleton.java b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/SynchronizedLazyLoadedSingleton.java new file mode 100644 index 0000000000..fe3457e054 --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/main/java/com/baledung/billpugh/SynchronizedLazyLoadedSingleton.java @@ -0,0 +1,15 @@ +package com.baledung.billpugh; + +public class SynchronizedLazyLoadedSingleton { + private static SynchronizedLazyLoadedSingleton synchronizedLazyLoadedSingleton; + + private SynchronizedLazyLoadedSingleton() { + } + + public static synchronized SynchronizedLazyLoadedSingleton getInstance() { + if (null == synchronizedLazyLoadedSingleton) { + synchronizedLazyLoadedSingleton = new SynchronizedLazyLoadedSingleton(); + } + return synchronizedLazyLoadedSingleton; + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java new file mode 100644 index 0000000000..b42d36229f --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java @@ -0,0 +1,43 @@ +package com.baledung.billpugh; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BillPughSingletonUnitTest { + Logger logger = LoggerFactory.getLogger(BillPughSingletonUnitTest.class); + @Test + void giveSynchronizedLazyLoadedImpl_whenCallgetInstance_thenReturnSingleton() { + Set setHoldingSingletonObj = new HashSet<>(); + List> futures = new ArrayList<>(); + + ExecutorService executorService = Executors.newFixedThreadPool(10); + Callable runnableTask = () -> { + logger.info("run called for:" + Thread.currentThread().getName()); + return BillPughSingleton.getInstance(); + }; + + int count = 0; + while(count < 10) { + futures.add(executorService.submit(runnableTask)); + count++; + } + futures.forEach(e -> { + try { + setHoldingSingletonObj.add(e.get()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + executorService.shutdown(); + assertEquals(1, setHoldingSingletonObj.size()); + } +} diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/EagerLoadedSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/EagerLoadedSingletonUnitTest.java new file mode 100644 index 0000000000..fd65ff6c5b --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/EagerLoadedSingletonUnitTest.java @@ -0,0 +1,46 @@ +package com.baledung.billpugh; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EagerLoadedSingletonUnitTest { + + Logger logger = LoggerFactory.getLogger(EagerLoadedSingletonUnitTest.class); + + @Test + void giveEagerLoadedImpl_whenCallgetInstance_thenReturnSingleton() { + Set set = new HashSet<>(); + List> futures = new ArrayList<>(); + + ExecutorService executorService = Executors.newFixedThreadPool(10); + Callable runnableTask = () -> { + logger.info("run called for:" + Thread.currentThread().getName()); + return EagerLoadedSingleton.getInstance(); + }; + + int count = 0; + while(count < 10) { + futures.add(executorService.submit(runnableTask)); + count++; + } + futures.forEach(e -> { + try { + set.add(e.get()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + executorService.shutdown(); + assertEquals(1, set.size()); + } + +} diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/LazyLoadedSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/LazyLoadedSingletonUnitTest.java new file mode 100644 index 0000000000..0e0ea25779 --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/LazyLoadedSingletonUnitTest.java @@ -0,0 +1,17 @@ +package com.baledung.billpugh; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +public class LazyLoadedSingletonUnitTest { + + @Test + void givenLazyLoadedImpl_whenCallGetInstance_thenReturnSingleInstance() throws ClassNotFoundException { + Class bs = Class.forName("com.baledung.billpugh.LazyLoadedSingleton"); + assertThrows(IllegalAccessException.class, () -> bs.getDeclaredConstructor().newInstance()); + + LazyLoadedSingleton lazyLoadedSingletonObj1 = LazyLoadedSingleton.getInstance(); + LazyLoadedSingleton lazyLoadedSingletonObj2 = LazyLoadedSingleton.getInstance(); + assertEquals(lazyLoadedSingletonObj1.hashCode(), lazyLoadedSingletonObj2.hashCode()); + } +} diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/SynchronizedLazyLoadedSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/SynchronizedLazyLoadedSingletonUnitTest.java new file mode 100644 index 0000000000..1f1636b458 --- /dev/null +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/SynchronizedLazyLoadedSingletonUnitTest.java @@ -0,0 +1,44 @@ +package com.baledung.billpugh; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SynchronizedLazyLoadedSingletonUnitTest { + Logger logger = LoggerFactory.getLogger(SynchronizedLazyLoadedSingletonUnitTest.class); + @Test + void giveSynchronizedLazyLoadedImpl_whenCallgetInstance_thenReturnSingleton() { + Set setHoldingSingletonObj = new HashSet<>(); + List> futures = new ArrayList<>(); + + ExecutorService executorService = Executors.newFixedThreadPool(10); + Callable runnableTask = () -> { + logger.info("run called for:" + Thread.currentThread().getName()); + return SynchronizedLazyLoadedSingleton.getInstance(); + }; + + int count = 0; + while(count < 10) { + futures.add(executorService.submit(runnableTask)); + count++; + } + futures.forEach(e -> { + try { + setHoldingSingletonObj.add(e.get()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + }); + executorService.shutdown(); + assertEquals(1, setHoldingSingletonObj.size()); + } + +} From 4596614dc9721bc246c587f35092c86330a92629 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 29 Oct 2023 01:42:22 +0530 Subject: [PATCH 265/831] Initial Commit --- .../core-java-persistence-3/pom.xml | 35 ++++++ .../ResultSetToMapUnitTest.java | 105 ++++++++++++++++++ persistence-modules/pom.xml | 1 + 3 files changed, 141 insertions(+) create mode 100644 persistence-modules/core-java-persistence-3/pom.xml create mode 100644 persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java diff --git a/persistence-modules/core-java-persistence-3/pom.xml b/persistence-modules/core-java-persistence-3/pom.xml new file mode 100644 index 0000000000..6868da27be --- /dev/null +++ b/persistence-modules/core-java-persistence-3/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + com.baeldung.core-java-persistence-3 + core-java-persistence-3 + core-java-persistence-3 + 0.1.0-SNAPSHOT + jar + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + com.h2database + h2 + ${h2.version} + + + org.springframework + spring-jdbc + ${spring-jdbc.version} + + + commons-dbutils + commons-dbutils + ${commons-dbutils.version} + + + + 2.1.214 + 5.3.29 + 1.8.1 + + \ No newline at end of file diff --git a/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java new file mode 100644 index 0000000000..b483cc04c9 --- /dev/null +++ b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung.resultsettomap; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.ResultSetHandler; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ResultSetToMapUnitTest { + private static Connection connection = null; + private static final String JDBC_URL = "jdbc:h2:mem:testDatabase"; + private static final String USERNAME = "dbUser"; + private static final String PASSWORD = "dbPassword"; + + @Before + public void setup() throws Exception { + connection = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD); + initialDataSetup(); + } + + private void initialDataSetup() throws SQLException { + Statement statement = connection.createStatement(); + String sql = "CREATE TABLE EMPLOYEE (empId INTEGER not null, empName VARCHAR(50), empCity VARCHAR(50), PRIMARY KEY (empId))"; + statement.executeUpdate(sql); + List sqlQueryList = Arrays.asList("INSERT INTO EMPLOYEE VALUES (1, 'Steve','London')", "INSERT INTO EMPLOYEE VALUES (2, 'John','London')", "INSERT INTO EMPLOYEE VALUES (3, 'David', 'Sydney')", + "INSERT INTO EMPLOYEE VALUES (4, 'Kevin','London')", "INSERT INTO EMPLOYEE VALUES (5, 'Jade', 'Sydney')"); + for (String query : sqlQueryList) { + statement.executeUpdate(query); + } + } + + @Test + public void whenUsingNativeJava_thenConvertResultSetToMap() throws SQLException { + ResultSet resultSet = connection.prepareStatement("SELECT * FROM EMPLOYEE") + .executeQuery(); + Map> valueMap = new HashMap<>(); + + while (resultSet.next()) { + String empCity = resultSet.getString("empCity"); + String empName = resultSet.getString("empName"); + if (!valueMap.containsKey(empCity)) { + valueMap.putIfAbsent(empCity, new ArrayList<>()); + } + valueMap.get(empCity) + .add(empName); + } + assertEquals(3, valueMap.get("London") + .size()); + } + + @Test + public void whenUsingLambda_thenConvertResultSetToMap() throws SQLException { + ResultSet resultSet = connection.prepareStatement("SELECT * FROM EMPLOYEE") + .executeQuery(); + Map> valueMap = new HashMap<>(); + + while (resultSet.next()) { + String empCity = resultSet.getString("empCity"); + String empName = resultSet.getString("empName"); + valueMap.computeIfAbsent(empCity, data -> new ArrayList<>()) + .add(empName); + } + assertEquals(3, valueMap.get("London") + .size()); + } + + @Test + public void whenUsingDbUtils_thenConvertResultSetToMap() throws SQLException { + + ResultSetHandler>> handler = new ResultSetHandler>>() { + public Map> handle(ResultSet resultSet) throws SQLException { + Map> result = new HashMap<>(); + while (resultSet.next()) { + String empCity = resultSet.getString("empCity"); + String empName = resultSet.getString("empName"); + result.computeIfAbsent(empCity, data -> new ArrayList<>()) + .add(empName); + } + return result; + } + }; + QueryRunner run = new QueryRunner(); + Map> valueMap = run.query(connection, "SELECT * FROM EMPLOYEE", handler); + assertEquals(3, valueMap.get("London") + .size()); + } + + @After + public void preDestroy() throws Exception { + connection.close(); + } +} diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index a99a180390..162894f1e0 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -21,6 +21,7 @@ blaze-persistence core-java-persistence core-java-persistence-2 + core-java-persistence-3 elasticsearch flyway flyway-repair From 6d2e874c264e67437078e9506e19dca6f0c181a9 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Sun, 29 Oct 2023 01:46:23 +0530 Subject: [PATCH 266/831] Updated Pom --- persistence-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 53e408c3a5..9c150a28d7 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -21,6 +21,7 @@ blaze-persistence core-java-persistence core-java-persistence-2 + core-java-persistence-3 couchbase elasticsearch flyway From 080dded9a425f505119d9b711af4f9b2e92bf7c0 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sat, 28 Oct 2023 23:45:22 +0300 Subject: [PATCH 267/831] JAVA-25525 Adding other service dependencies to run the project --- reactive-systems/docker-compose.yml | 41 ++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/reactive-systems/docker-compose.yml b/reactive-systems/docker-compose.yml index 2e40d1999a..51e15f6a19 100644 --- a/reactive-systems/docker-compose.yml +++ b/reactive-systems/docker-compose.yml @@ -4,15 +4,54 @@ services: build: ./frontend ports: - "80:80" + zookeeper: + image: confluentinc/cp-zookeeper:latest + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + ports: + - 22181:2181 + kafka: + image: confluentinc/cp-kafka:latest + container_name: kafka-broker + depends_on: + - zookeeper + ports: + - 29092:29092 + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker:9092,PLAINTEXT_HOST://localhost:29092 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + mongodb: + container_name: mongo-db + image: mongo:6.0 + volumes: + - ~/mongo:/data/db + ports: + - "27017:27017" + healthcheck: + test: exit 0 order-service: build: ./order-service ports: - "8080:8080" + depends_on: + mongodb: + condition: service_healthy inventory-service: build: ./inventory-service ports: - "8081:8081" + depends_on: + mongodb: + condition: service_healthy shipping-service: build: ./shipping-service ports: - - "8082:8082" \ No newline at end of file + - "8082:8082" + depends_on: + mongodb: + condition: service_healthy \ No newline at end of file From c65981938f9be61a5182259c911462a21671a940 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Sat, 28 Oct 2023 23:56:11 +0200 Subject: [PATCH 268/831] [BAEL-7048] - Passing Strings By Reference in Java (#15047) * feat: pass by reference java string * fix: review --- .../baeldung/passstringbyreference/Dummy.java | 14 +++ .../PassStringUnitTest.java | 85 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/Dummy.java create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/PassStringUnitTest.java diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/Dummy.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/Dummy.java new file mode 100644 index 0000000000..27ebf8331f --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/Dummy.java @@ -0,0 +1,14 @@ +package com.baeldung.passstringbyreference; + +public class Dummy { + + String dummyString; + + public String getDummyString() { + return dummyString; + } + + public void setDummyString(String dummyString) { + this.dummyString = dummyString; + } +} diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/PassStringUnitTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/PassStringUnitTest.java new file mode 100644 index 0000000000..e1b284a94e --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/passstringbyreference/PassStringUnitTest.java @@ -0,0 +1,85 @@ +package com.baeldung.passstringbyreference; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; + +class PassStringUnitTest { + + @Test + void givenAString_whenPassedToVoidMethod_thenStringIsNotModified() { + String s = "hello"; + concatStringWithNoReturn(s); + assertEquals("hello", s); + } + + void concatStringWithNoReturn(String input) { + input += " world"; + assertEquals("hello world", input); + } + + @Test + void givenAString_whenPassedToMethodAndReturnNewString_thenStringIsModified() { + String s = "hello"; + assertEquals("hello world", concatStringWithReturn(s)); + } + + String concatStringWithReturn(String input) { + return input + " world"; + } + + @Test + void givenAString_whenPassStringBuilderToVoidMethod_thenConcatNewStringOk() { + StringBuilder builder = new StringBuilder("hello"); + concatWithStringBuilder(builder); + + assertEquals("hello world", builder.toString()); + } + + void concatWithStringBuilder(StringBuilder input) { + input.append(" world"); + } + + @Test + void givenAString_whenPassStringBufferToVoidMethod_thenConcatNewStringOk() { + StringBuffer builder = new StringBuffer("hello"); + concatWithStringBuffer(builder); + + assertEquals("hello world", builder.toString()); + } + + void concatWithStringBuffer(StringBuffer input) { + input.append(" world"); + } + + @Test + void givenObjectWithStringField_whenSetDifferentValue_thenObjectIsModified() { + Dummy dummy = new Dummy(); + assertNull(dummy.getDummyString()); + modifyStringValueInInputObject(dummy, "hello world"); + assertEquals("hello world", dummy.getDummyString()); + } + + void modifyStringValueInInputObject(Dummy dummy, String dummyString) { + dummy.setDummyString(dummyString); + } + + @Test + void givenObjectWithStringField_whenSetDifferentValueWithStringBuilder_thenSetStringInNewObject() { + assertEquals("hello world", getDummy("hello", "world").getDummyString()); + } + + Dummy getDummy(String hello, String world) { + StringBuilder builder = new StringBuilder(); + + builder.append(hello) + .append(" ") + .append(world); + + Dummy dummy = new Dummy(); + dummy.setDummyString(builder.toString()); + + return dummy; + } +} From 3df29751a7c5b614719103f8a05fc97392246083 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:29:25 +0800 Subject: [PATCH 269/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 2724df5695..5599187cd8 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Difference Between putIfAbsent() and computeIfAbsent() in Java’s Map](https://www.baeldung.com/java-map-putifabsent-computeifabsent) +- [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) From 467b9a2fedde46fb7633f99c83a91553f4a1bcfa Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:31:46 +0800 Subject: [PATCH 270/831] Update README.md [skip ci] --- core-java-modules/core-java-string-algorithms-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-algorithms-3/README.md b/core-java-modules/core-java-string-algorithms-3/README.md index 3ef07129ed..abcac63ea4 100644 --- a/core-java-modules/core-java-string-algorithms-3/README.md +++ b/core-java-modules/core-java-string-algorithms-3/README.md @@ -13,3 +13,4 @@ This module contains articles about string-related algorithms. - [Find the Most Frequent Characters in a String](https://www.baeldung.com/java-string-find-most-frequent-characters) - [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring) - [Check if Letter Is Emoji With Java](https://www.baeldung.com/java-check-letter-emoji) +- [Wrapping a String After a Number of Characters Word-Wise](https://www.baeldung.com/java-wrap-string-number-characters-word-wise) From 353b0974ddce8727cf76526c4b3ccfcc943cf346 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:35:10 +0800 Subject: [PATCH 271/831] Update README.md [skip ci] --- testing-modules/testing-libraries-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/testing-libraries-2/README.md b/testing-modules/testing-libraries-2/README.md index 9e17da96a7..a37612e207 100644 --- a/testing-modules/testing-libraries-2/README.md +++ b/testing-modules/testing-libraries-2/README.md @@ -7,3 +7,4 @@ - [Gray Box Testing Using the OAT Technique](https://www.baeldung.com/java-gray-box-orthogonal-array-testing) - [Unit Testing of System.in With JUnit](https://www.baeldung.com/java-junit-testing-system-in) - [Fail Maven Build if JUnit Coverage Falls Below Certain Threshold](https://www.baeldung.com/maven-junit-fail-build-coverage-threshold) +- [How to Mock Environment Variables in Unit Tests](https://www.baeldung.com/java-unit-testing-environment-variables) From f6deb1c0ef3ed7361a397704006fa92993485ffc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:40:01 +0800 Subject: [PATCH 272/831] Update README.md [skip ci] --- core-java-modules/core-java-string-conversions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-conversions-3/README.md b/core-java-modules/core-java-string-conversions-3/README.md index 4ec4771eea..732c864a42 100644 --- a/core-java-modules/core-java-string-conversions-3/README.md +++ b/core-java-modules/core-java-string-conversions-3/README.md @@ -3,3 +3,4 @@ - [Convert String to Int Using Encapsulation](https://www.baeldung.com/java-encapsulation-convert-string-to-int) - [HashMap with Multiple Values for the Same Key](https://www.baeldung.com/java-hashmap-multiple-values-per-key) - [Split Java String Into Key-Value Pairs](https://www.baeldung.com/java-split-string-map) +- [How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) From 499705b6d1c3466d991f0aaff3416f60c1d8f6a5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:42:50 +0800 Subject: [PATCH 273/831] Update README.md [skip ci] --- core-java-modules/core-java-string-conversions-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-conversions-3/README.md b/core-java-modules/core-java-string-conversions-3/README.md index 732c864a42..ec169f71d2 100644 --- a/core-java-modules/core-java-string-conversions-3/README.md +++ b/core-java-modules/core-java-string-conversions-3/README.md @@ -4,3 +4,4 @@ - [HashMap with Multiple Values for the Same Key](https://www.baeldung.com/java-hashmap-multiple-values-per-key) - [Split Java String Into Key-Value Pairs](https://www.baeldung.com/java-split-string-map) - [How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) +- [How to Convert an Object to String](https://www.baeldung.com/java-object-string-representation) From 8518e65d78c8015e903242c39e5c8bc21b6b493f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:51:40 +0800 Subject: [PATCH 274/831] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index e7c58a0eb2..629d52f0a9 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -4,3 +4,4 @@ - [Aggregate Runtime Exceptions in Java Streams](https://www.baeldung.com/java-streams-aggregate-exceptions) - [Streams vs. Loops in Java](https://www.baeldung.com/java-streams-vs-loops) - [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream) +- [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams) From 5677bcfc8143e5f221a4ea6a940770a64cca49ca Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 06:57:33 +0800 Subject: [PATCH 275/831] Create README.md [skip ci] --- spring-boot-modules/spring-boot-3-2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3-2/README.md diff --git a/spring-boot-modules/spring-boot-3-2/README.md b/spring-boot-modules/spring-boot-3-2/README.md new file mode 100644 index 0000000000..c176de2310 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Spring Boot 3.1’s ConnectionDetails Abstraction](https://www.baeldung.com/spring-boot-3-1-connectiondetails-abstraction) From a068b3886fdd2a87d4c8a85df8776300a589ba4a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:00:26 +0800 Subject: [PATCH 276/831] Update README.md [skip ci] --- spring-security-modules/spring-security-core-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-core-2/README.md b/spring-security-modules/spring-security-core-2/README.md index 80027ea42f..5f54dc1a50 100644 --- a/spring-security-modules/spring-security-core-2/README.md +++ b/spring-security-modules/spring-security-core-2/README.md @@ -8,7 +8,8 @@ This module contains articles about core Spring Security - [Prevent Cross-Site Scripting (XSS) in a Spring Application](https://www.baeldung.com/spring-prevent-xss) - [Guide to the AuthenticationManagerResolver in Spring Security](https://www.baeldung.com/spring-security-authenticationmanagerresolver) - [A Custom Spring SecurityConfigurer](https://www.baeldung.com/spring-security-custom-configurer) - +- [HttpSecurity vs. WebSecurity in Spring Security](https://www.baeldung.com/spring-security-httpsecurity-vs-websecurity) + ### Build the Project `mvn clean install` From fcff2408650431cc9c8a53d982e40e192e073398 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:02:12 +0800 Subject: [PATCH 277/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md index e478d87ad0..1939e5ca3f 100644 --- a/core-java-modules/core-java-collections-5/README.md +++ b/core-java-modules/core-java-collections-5/README.md @@ -7,4 +7,5 @@ - [Creating Custom Iterator in Java](https://www.baeldung.com/java-creating-custom-iterator) - [Difference Between Arrays.sort() and Collections.sort()](https://www.baeldung.com/java-arrays-collections-sort-methods) - [Skipping the First Iteration in Java](https://www.baeldung.com/java-skip-first-iteration) +- [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) From fde7fabe427559129ea8cfd7d34dbbf85c4e85e5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:04:20 +0800 Subject: [PATCH 278/831] Update README.md [skip ci] --- core-java-modules/core-java-arrays-operations-basic-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-operations-basic-2/README.md b/core-java-modules/core-java-arrays-operations-basic-2/README.md index da2f17111f..07eb82ec68 100644 --- a/core-java-modules/core-java-arrays-operations-basic-2/README.md +++ b/core-java-modules/core-java-arrays-operations-basic-2/README.md @@ -3,3 +3,4 @@ This module contains articles about Java array fundamentals. They assume no previous background knowledge on working with arrays. ### Relevant Articles: +- [Arrays mismatch() Method in Java](https://www.baeldung.com/java-arrays-mismatch) From b4fd454c652db63fbc8476cf1f3fdc8cb850469d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:07:22 +0800 Subject: [PATCH 279/831] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-3/README.md b/core-java-modules/core-java-concurrency-basic-3/README.md index b9c66b279c..179a69495c 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -10,4 +10,5 @@ This module contains articles about basic Java concurrency. - [Returning a Value After Finishing Thread’s Job in Java](https://www.baeldung.com/java-return-value-after-thread-finish) - [CompletableFuture and ThreadPool in Java](https://www.baeldung.com/java-completablefuture-threadpool) - [CompletableFuture allOf().join() vs. CompletableFuture.join()](https://www.baeldung.com/java-completablefuture-allof-join) +- [Retry Logic with CompletableFuture](https://www.baeldung.com/java-completablefuture-retry-logic) - [[<-- Prev]](../core-java-concurrency-basic-2) From 1425f647f6465b93deb5863ff0036710eba19e62 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:09:45 +0800 Subject: [PATCH 280/831] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-simple/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-simple/README.md b/core-java-modules/core-java-concurrency-simple/README.md index 5cbfc67862..422d33e2c3 100644 --- a/core-java-modules/core-java-concurrency-simple/README.md +++ b/core-java-modules/core-java-concurrency-simple/README.md @@ -12,6 +12,7 @@ This module contains articles about Java Concurrency that are also part of an Eb - [Guide to the Volatile Keyword in Java](https://www.baeldung.com/java-volatile) - [A Guide to the Java ExecutorService](https://www.baeldung.com/java-executor-service-tutorial) - [Guide To CompletableFuture](https://www.baeldung.com/java-completablefuture) +- [How To Manage Timeout for CompletableFuture](https://www.baeldung.com/java-completablefuture-timeout) ### NOTE: From 19df93af17f1145e0ee2f746bd005f64f0e8912c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:12:24 +0800 Subject: [PATCH 281/831] Update README.md [skip ci] --- libraries-io/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-io/README.md b/libraries-io/README.md index 6cfe978d91..a9ca5df3d6 100644 --- a/libraries-io/README.md +++ b/libraries-io/README.md @@ -3,4 +3,4 @@ - [Transferring a File Through SFTP in Java](https://www.baeldung.com/java-file-sftp) - [How to Create Password-Protected Zip Files and Unzip Them in Java](https://www.baeldung.com/java-password-protected-zip-unzip) - +- [How to Create CSV File from POJO with Custom Column Headers and Positions](https://www.baeldung.com/java-create-csv-pojo-customize-columns) From 78dc038e8bcc7d1aedeee356f2647d6cc6b80e31 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:14:25 +0800 Subject: [PATCH 282/831] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-7/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index 7020369f02..6c4fab384b 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: -[How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) +- [How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) +- [Capitalize the First Letter of Each Word in a String](https://www.baeldung.com/java-string-initial-capital-letter-every-word) From fc2cf6cfacce5d594bb25fe308ecfe8cc2b8418b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:18:49 +0800 Subject: [PATCH 283/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md index 8791aaae1f..ded5db30e4 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -8,3 +8,4 @@ - [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) - [Working with Virtual Threads in Spring 6](https://www.baeldung.com/spring-6-virtual-threads) - [Docker Compose Support in Spring Boot 3](https://www.baeldung.com/ops/docker-compose-support-spring-boot) +- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient) From ff76b6c94970d70b3d27730e4a608a8c20800bed Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 29 Oct 2023 07:25:11 +0800 Subject: [PATCH 284/831] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-6/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-6/README.md b/core-java-modules/core-java-string-operations-6/README.md index b4b78d1ad7..9d92552dd1 100644 --- a/core-java-modules/core-java-string-operations-6/README.md +++ b/core-java-modules/core-java-string-operations-6/README.md @@ -11,4 +11,4 @@ - [Check if a String Has All Unique Characters in Java](https://www.baeldung.com/java-check-string-all-unique-chars) - [Performance Comparison Between Different Java String Concatenation Methods](https://www.baeldung.com/java-string-concatenation-methods) - [Replacing Single Quote with \’ in Java String](https://www.baeldung.com/java-replacing-single-quote-string) - +- [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence) From c115e99dccf7dc1470a5856535fb9fced45d7991 Mon Sep 17 00:00:00 2001 From: pentakon Date: Sun, 29 Oct 2023 06:27:34 +0200 Subject: [PATCH 285/831] BAEL-6814 Convert List to CompletableFuture (#15028) * Code for BAEL-6814 Convert List to CompletableFuture * Refactor some comments --- .../completablefuturelist/Application.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuturelist/Application.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuturelist/Application.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuturelist/Application.java new file mode 100644 index 0000000000..be5d9e8479 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuturelist/Application.java @@ -0,0 +1,100 @@ +package com.baeldung.concurrent.completablefuturelist; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.stream.Collectors; + +public class Application { + + ScheduledExecutorService asyncOperationEmulation; + + Application initialize() { + asyncOperationEmulation = Executors.newScheduledThreadPool(10); + return this; + } + + CompletableFuture asyncOperation(String operationId) { + CompletableFuture cf = new CompletableFuture<>(); + asyncOperationEmulation.submit(() -> { + // The following lines simulate an exception happening on the 567th operation + // if (operationId.endsWith("567")) { + // cf.completeExceptionally(new Exception("Error on operation " + operationId)); + // return; + // } + try { + Thread.sleep(100); + cf.complete(operationId); + } catch (InterruptedException e) { + System.err.println("Thread interrupted error"); + cf.completeExceptionally(e); + } + }); + return cf; + } + + void startNaive() { + List> futures = new ArrayList<>(); + for (int i = 1; i <= 1000; i++) { + String operationId = "Naive-Operation-" + i; + futures.add(asyncOperation(operationId)); + } + + CompletableFuture> aggregate = CompletableFuture.completedFuture(new ArrayList<>()); + for (CompletableFuture future : futures) { + aggregate = aggregate.thenCompose(list -> { + try { + list.add(future.get()); + return CompletableFuture.completedFuture(list); + } catch (Exception e) { + final CompletableFuture> excFuture = new CompletableFuture<>(); + excFuture.completeExceptionally(e); + return excFuture; + } + }); + } + + try { + final List results = aggregate.join(); + System.out.println("Printing first 10 results"); + for (int i = 0; i < 10; i++) { + System.out.println("Finished " + results.get(i)); + } + } finally { + close(); + } + } + + void start() { + List> futures = new ArrayList<>(); + for (int i = 1; i <= 1000; i++) { + String operationId = "Operation-" + i; + futures.add(asyncOperation(operationId)); + } + CompletableFuture[] futuresArray = futures.toArray(new CompletableFuture[0]); + CompletableFuture> listFuture = CompletableFuture.allOf(futuresArray).thenApply(v -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList())); + try { + final List results = listFuture.join(); + System.out.println("Printing first 10 results"); + for (int i = 0; i < 10; i++) { + System.out.println("Finished " + results.get(i)); + } + } finally { + close(); + } + } + + void close() { + asyncOperationEmulation.shutdownNow(); + } + + public static void main(String[] args) { + new Application().initialize() + // Switch between .startNaive() and .start() to test both implementations + // .startNaive(); + .start(); + } + +} From f5ce4e6d86e5a1e8998d8ce675838f713af02871 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sun, 29 Oct 2023 05:28:39 +0100 Subject: [PATCH 286/831] PrintWriter vs FileWriter in Java (#15034) * https://jira.baeldung.com/browse/BAEL-7117 * PrintWriter vs FileWriter in Java * PrintWriter vs FileWriter in Java * https://jira.baeldung.com/browse/BAEL-7117 * PrintWriter vs FileWriter in Java --- .../core-java-io-apis-2/alabama.txt | 2 + .../core-java-io-apis-2/dream.txt | 1 + .../core-java-io-apis-2/potter.txt | 1 + .../PrintWriterVsFilePrinterUnitTest.java | 64 +++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 core-java-modules/core-java-io-apis-2/alabama.txt create mode 100644 core-java-modules/core-java-io-apis-2/dream.txt create mode 100644 core-java-modules/core-java-io-apis-2/potter.txt create mode 100644 core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/printwritervsfilewriter/PrintWriterVsFilePrinterUnitTest.java diff --git a/core-java-modules/core-java-io-apis-2/alabama.txt b/core-java-modules/core-java-io-apis-2/alabama.txt new file mode 100644 index 0000000000..d421fa5c33 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/alabama.txt @@ -0,0 +1,2 @@ +I'm going to Alabama +Alabama is a state in the US diff --git a/core-java-modules/core-java-io-apis-2/dream.txt b/core-java-modules/core-java-io-apis-2/dream.txt new file mode 100644 index 0000000000..a4821c7dd4 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/dream.txt @@ -0,0 +1 @@ +Dreams from My Father by Barack Obama \ No newline at end of file diff --git a/core-java-modules/core-java-io-apis-2/potter.txt b/core-java-modules/core-java-io-apis-2/potter.txt new file mode 100644 index 0000000000..78974da192 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/potter.txt @@ -0,0 +1 @@ +Harry Potter and the Chamber of Secrets \ No newline at end of file diff --git a/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/printwritervsfilewriter/PrintWriterVsFilePrinterUnitTest.java b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/printwritervsfilewriter/PrintWriterVsFilePrinterUnitTest.java new file mode 100644 index 0000000000..6e44ad8318 --- /dev/null +++ b/core-java-modules/core-java-io-apis-2/src/test/java/com/baeldung/printwritervsfilewriter/PrintWriterVsFilePrinterUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.printwritervsfilewriter; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class PrintWriterVsFilePrinterUnitTest { + + @Test + public void whenWritingToTextFileUsingFileWriter_thenTextMatches() throws IOException { + String result = "Harry Potter and the Chamber of Secrets"; + + File file = new File("potter.txt"); + try (FileWriter fw = new FileWriter(file);) { + fw.write("Harry Potter and the Chamber of Secrets"); + } + + try (BufferedReader reader = new BufferedReader(new FileReader(file));) { + String actualData = reader.readLine(); + assertEquals(result, actualData); + } + } + + @Test + public void whenWritingToTextFileUsingPrintWriterPrintf_thenTextMatches() throws IOException { + String result = "Dreams from My Father by Barack Obama"; + File file = new File("dream.txt"); + try (PrintWriter pw = new PrintWriter(file);) { + String author = "Barack Obama"; + pw.printf("Dreams from My Father by %s", author); + assertTrue(!pw.checkError()); + } + + try (BufferedReader reader = new BufferedReader(new FileReader(file));) { + String actualData = reader.readLine(); + assertEquals(result, actualData); + } + } + + @Test + public void whenWritingToTextFileUsingPrintWriterPrintln_thenTextMatches() throws IOException { + String result = "I'm going to Alabama\nAlabama is a state in the US\n"; + try (PrintWriter pw = new PrintWriter("alabama.txt");) { + pw.println("I'm going to Alabama"); + pw.println("Alabama is a state in the US"); + } + Path path = Paths.get("alabama.txt"); + String actualData = new String(Files.readAllBytes(path)); + assertEquals(result, actualData); + } + +} From 05230cf79d975489269717e0dcd821847fbfbfc9 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 29 Oct 2023 18:54:02 +0200 Subject: [PATCH 287/831] [JAVA-26374-boot-data] Moved "Spring Boot: Customize the Jackson ObjectMapper" article to spring-boot-data (#15095) --- spring-boot-modules/spring-boot-data-2/README.md | 1 - spring-boot-modules/spring-boot-data/README.md | 1 + .../com/baeldung/boot/jackson/app/Application.java | 0 .../baeldung/boot/jackson/config/CoffeeConstants.java | 4 ++-- .../boot/jackson/config/CoffeeCustomizerConfig.java | 5 +++-- .../config/CoffeeHttpConverterConfiguration.java | 5 +++-- .../jackson/config/CoffeeJacksonBuilderConfig.java | 5 +++-- .../boot/jackson/config/CoffeeObjectMapperConfig.java | 9 +++++---- .../jackson/config/CoffeeRegisterModuleConfig.java | 8 ++++---- .../boot/jackson/controller/CoffeeController.java | 5 +++-- .../java/com/baeldung/boot/jackson/model/Coffee.java | 0 .../src/main/resources/coffee.properties | 0 .../jackson/app/AbstractCoffeeIntegrationTest.java | 11 ++++++----- .../jackson/app/CoffeeCustomizerIntegrationTest.java | 3 ++- .../app/CoffeeHttpConverterIntegrationTest.java | 3 ++- .../app/CoffeeJacksonBuilderIntegrationTest.java | 3 ++- .../app/CoffeeObjectMapperIntegrationTest.java | 3 ++- .../app/CoffeeRegisterModuleIntegrationTest.java | 3 ++- 18 files changed, 40 insertions(+), 29 deletions(-) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/app/Application.java (100%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java (100%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java (88%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/java/com/baeldung/boot/jackson/model/Coffee.java (100%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/main/resources/coffee.properties (100%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java (99%) rename spring-boot-modules/{spring-boot-data-2 => spring-boot-data}/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java (99%) diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index 9ff2b2caf8..8e6619dce4 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -1,7 +1,6 @@ ### Relevant Articles: - [HttpMessageNotWritableException: No Converter for [class …] With Preset Content-Type](https://www.baeldung.com/spring-no-converter-with-preset) -- [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper) - [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found) - [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository) - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) diff --git a/spring-boot-modules/spring-boot-data/README.md b/spring-boot-modules/spring-boot-data/README.md index c56c87014d..aa745b77a2 100644 --- a/spring-boot-modules/spring-boot-data/README.md +++ b/spring-boot-modules/spring-boot-data/README.md @@ -11,4 +11,5 @@ This module contains articles about Spring Boot with Spring Data - [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) - [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) - [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) +- [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper) diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/app/Application.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/app/Application.java similarity index 100% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/app/Application.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/app/Application.java diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java similarity index 100% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java index d1875d03d9..ecb07e44b1 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeConstants.java @@ -1,10 +1,10 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; - import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; + public class CoffeeConstants { public static final String DATETIME_FORMAT = "dd-MM-yyyy HH:mm"; diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java index edb2b478fc..0aa2d3eb96 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeCustomizerConfig.java @@ -1,11 +1,12 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.annotation.JsonInclude; +import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; + import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; +import com.fasterxml.jackson.annotation.JsonInclude; @Configuration public class CoffeeCustomizerConfig { diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java index eff2b5c252..be8e3bb34d 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeHttpConverterConfiguration.java @@ -1,12 +1,13 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.annotation.JsonInclude; +import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; +import com.fasterxml.jackson.annotation.JsonInclude; @Configuration public class CoffeeHttpConverterConfiguration { diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java index 8057fff3db..19501f872c 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeJacksonBuilderConfig.java @@ -1,12 +1,13 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.annotation.JsonInclude; +import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; +import com.fasterxml.jackson.annotation.JsonInclude; @Configuration public class CoffeeJacksonBuilderConfig { diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java index f1ce6458ae..cadf17b6b8 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeObjectMapperConfig.java @@ -1,13 +1,14 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; -import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @Configuration public class CoffeeObjectMapperConfig { diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java similarity index 88% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java index fc157f8156..55a928dabc 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/config/CoffeeRegisterModuleConfig.java @@ -1,19 +1,19 @@ package com.baeldung.boot.jackson.config; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; -import static com.baeldung.boot.jackson.config.CoffeeConstants.LOCAL_DATETIME_SERIALIZER; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @Configuration @PropertySource("classpath:coffee.properties") public class CoffeeRegisterModuleConfig { @Bean - public Module javaTimeModule() { + public JavaTimeModule javaTimeModule() { JavaTimeModule module = new JavaTimeModule(); module.addSerializer(LOCAL_DATETIME_SERIALIZER); return module; diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java index 23749b18a2..36489a645a 100644 --- a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java +++ b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/controller/CoffeeController.java @@ -1,11 +1,12 @@ package com.baeldung.boot.jackson.controller; -import com.baeldung.boot.jackson.model.Coffee; +import static com.baeldung.boot.jackson.config.CoffeeConstants.FIXED_DATE; + import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import static com.baeldung.boot.jackson.config.CoffeeConstants.FIXED_DATE; +import com.baeldung.boot.jackson.model.Coffee; @RestController public class CoffeeController { diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/model/Coffee.java b/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/model/Coffee.java similarity index 100% rename from spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/jackson/model/Coffee.java rename to spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/boot/jackson/model/Coffee.java diff --git a/spring-boot-modules/spring-boot-data-2/src/main/resources/coffee.properties b/spring-boot-modules/spring-boot-data/src/main/resources/coffee.properties similarity index 100% rename from spring-boot-modules/spring-boot-data-2/src/main/resources/coffee.properties rename to spring-boot-modules/spring-boot-data/src/main/resources/coffee.properties diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java index f1bc35a8ce..961ab8979c 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/AbstractCoffeeIntegrationTest.java @@ -1,15 +1,16 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeConstants; +import static com.baeldung.boot.jackson.config.CoffeeConstants.FIXED_DATE; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.format.DateTimeFormatter; + 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 java.time.format.DateTimeFormatter; - -import static com.baeldung.boot.jackson.config.CoffeeConstants.FIXED_DATE; -import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.boot.jackson.config.CoffeeConstants; @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public abstract class AbstractCoffeeIntegrationTest { diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java index d690de1b9c..ed5baf239c 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeCustomizerIntegrationTest.java @@ -1,8 +1,9 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeCustomizerConfig; import org.springframework.context.annotation.Import; +import com.baeldung.boot.jackson.config.CoffeeCustomizerConfig; + @Import(CoffeeCustomizerConfig.class) public class CoffeeCustomizerIntegrationTest extends AbstractCoffeeIntegrationTest { } diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java index 62b1d42152..0c77948d8e 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeHttpConverterIntegrationTest.java @@ -1,8 +1,9 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeHttpConverterConfiguration; import org.springframework.context.annotation.Import; +import com.baeldung.boot.jackson.config.CoffeeHttpConverterConfiguration; + @Import(CoffeeHttpConverterConfiguration.class) public class CoffeeHttpConverterIntegrationTest extends AbstractCoffeeIntegrationTest { } diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java index 52a55394c0..da9251de99 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeJacksonBuilderIntegrationTest.java @@ -1,8 +1,9 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeJacksonBuilderConfig; import org.springframework.context.annotation.Import; +import com.baeldung.boot.jackson.config.CoffeeJacksonBuilderConfig; + @Import(CoffeeJacksonBuilderConfig.class) public class CoffeeJacksonBuilderIntegrationTest extends AbstractCoffeeIntegrationTest { } diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java index 34743ceba5..1226eacbf2 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeObjectMapperIntegrationTest.java @@ -1,8 +1,9 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeObjectMapperConfig; import org.springframework.context.annotation.Import; +import com.baeldung.boot.jackson.config.CoffeeObjectMapperConfig; + @Import(CoffeeObjectMapperConfig.class) public class CoffeeObjectMapperIntegrationTest extends AbstractCoffeeIntegrationTest { } diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java similarity index 99% rename from spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java rename to spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java index 69bbd5be2a..38dc4a76cd 100644 --- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java +++ b/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/boot/jackson/app/CoffeeRegisterModuleIntegrationTest.java @@ -1,8 +1,9 @@ package com.baeldung.boot.jackson.app; -import com.baeldung.boot.jackson.config.CoffeeRegisterModuleConfig; import org.springframework.context.annotation.Import; +import com.baeldung.boot.jackson.config.CoffeeRegisterModuleConfig; + @Import(CoffeeRegisterModuleConfig.class) public class CoffeeRegisterModuleIntegrationTest extends AbstractCoffeeIntegrationTest { } From b9fa942d274a490ff79b9e8411c1fd8447190ffc Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 29 Oct 2023 23:22:39 +0530 Subject: [PATCH 288/831] JAVA-26395 Move grails module to web-modules (#15072) --- pom.xml | 2 -- {grails => web-modules/grails}/.gitignore | 0 {grails => web-modules/grails}/README.md | 0 {grails => web-modules/grails}/build.gradle | 0 {grails => web-modules/grails}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 {grails => web-modules/grails}/gradlew | 0 {grails => web-modules/grails}/gradlew.bat | 0 .../assets/images/apple-touch-icon-retina.png | Bin .../grails-app/assets/images/apple-touch-icon.png | Bin .../grails}/grails-app/assets/images/favicon.ico | Bin .../assets/images/grails-cupsonly-logo-white.svg | 0 .../grails}/grails-app/assets/images/grails.svg | 0 .../grails-app/assets/images/skin/database_add.png | Bin .../assets/images/skin/database_delete.png | Bin .../grails-app/assets/images/skin/database_edit.png | Bin .../grails-app/assets/images/skin/database_save.png | Bin .../assets/images/skin/database_table.png | Bin .../grails-app/assets/images/skin/exclamation.png | Bin .../grails}/grails-app/assets/images/skin/house.png | Bin .../grails-app/assets/images/skin/information.png | Bin .../grails-app/assets/images/skin/shadow.jpg | Bin .../grails-app/assets/images/skin/sorted_asc.gif | Bin .../grails-app/assets/images/skin/sorted_desc.gif | Bin .../grails}/grails-app/assets/images/spinner.gif | Bin .../grails-app/assets/javascripts/application.js | 0 .../grails-app/assets/javascripts/bootstrap.js | 0 .../assets/javascripts/jquery-2.2.0.min.js | 0 .../grails-app/assets/stylesheets/application.css | 0 .../grails-app/assets/stylesheets/bootstrap.css | 0 .../grails-app/assets/stylesheets/errors.css | 0 .../grails-app/assets/stylesheets/grails.css | 0 .../grails}/grails-app/assets/stylesheets/main.css | 0 .../grails-app/assets/stylesheets/mobile.css | 0 .../grails}/grails-app/conf/application.yml | 0 .../grails}/grails-app/conf/logback.groovy | 0 .../grails}/grails-app/conf/spring/resources.groovy | 0 .../com/baeldung/grails/StudentController.groovy | 0 .../controllers/grails/UrlMappings.groovy | 0 .../domain/com/baeldung/grails/Student.groovy | 0 .../grails}/grails-app/i18n/messages.properties | 0 .../grails}/grails-app/i18n/messages_cs.properties | 0 .../grails}/grails-app/i18n/messages_da.properties | 0 .../grails}/grails-app/i18n/messages_de.properties | 0 .../grails}/grails-app/i18n/messages_es.properties | 0 .../grails}/grails-app/i18n/messages_fr.properties | 0 .../grails}/grails-app/i18n/messages_it.properties | 0 .../grails}/grails-app/i18n/messages_ja.properties | 0 .../grails}/grails-app/i18n/messages_nb.properties | 0 .../grails}/grails-app/i18n/messages_nl.properties | 0 .../grails}/grails-app/i18n/messages_pl.properties | 0 .../grails-app/i18n/messages_pt_BR.properties | 0 .../grails-app/i18n/messages_pt_PT.properties | 0 .../grails}/grails-app/i18n/messages_ru.properties | 0 .../grails}/grails-app/i18n/messages_sk.properties | 0 .../grails}/grails-app/i18n/messages_sv.properties | 0 .../grails}/grails-app/i18n/messages_th.properties | 0 .../grails-app/i18n/messages_zh_CN.properties | 0 .../grails-app/init/grails/Application.groovy | 0 .../grails}/grails-app/init/grails/BootStrap.groovy | 0 .../com/baeldung/grails/StudentService.groovy | 0 .../grails}/grails-app/views/error.gsp | 0 .../grails}/grails-app/views/index.gsp | 0 .../grails}/grails-app/views/layouts/main.gsp | 0 .../grails}/grails-app/views/notFound.gsp | 0 .../grails}/grails-app/views/student/create.gsp | 0 .../grails}/grails-app/views/student/index.gsp | 0 .../grails}/grails-app/views/student/show.gsp | 0 {grails => web-modules/grails}/grailsw | 0 {grails => web-modules/grails}/grailsw.bat | 0 .../baeldung/grails/StudentIntegrationSpec.groovy | 0 .../src/integration-test/resources/GebConfig.groovy | 0 .../baeldung/grails/StudentControllerSpec.groovy | 0 web-modules/pom.xml | 1 + 74 files changed, 1 insertion(+), 2 deletions(-) rename {grails => web-modules/grails}/.gitignore (100%) rename {grails => web-modules/grails}/README.md (100%) rename {grails => web-modules/grails}/build.gradle (100%) rename {grails => web-modules/grails}/gradle.properties (100%) rename {grails => web-modules/grails}/gradle/wrapper/gradle-wrapper.properties (100%) rename {grails => web-modules/grails}/gradlew (100%) rename {grails => web-modules/grails}/gradlew.bat (100%) rename {grails => web-modules/grails}/grails-app/assets/images/apple-touch-icon-retina.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/apple-touch-icon.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/favicon.ico (100%) rename {grails => web-modules/grails}/grails-app/assets/images/grails-cupsonly-logo-white.svg (100%) rename {grails => web-modules/grails}/grails-app/assets/images/grails.svg (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/database_add.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/database_delete.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/database_edit.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/database_save.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/database_table.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/exclamation.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/house.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/information.png (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/shadow.jpg (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/sorted_asc.gif (100%) rename {grails => web-modules/grails}/grails-app/assets/images/skin/sorted_desc.gif (100%) rename {grails => web-modules/grails}/grails-app/assets/images/spinner.gif (100%) rename {grails => web-modules/grails}/grails-app/assets/javascripts/application.js (100%) rename {grails => web-modules/grails}/grails-app/assets/javascripts/bootstrap.js (100%) rename {grails => web-modules/grails}/grails-app/assets/javascripts/jquery-2.2.0.min.js (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/application.css (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/bootstrap.css (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/errors.css (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/grails.css (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/main.css (100%) rename {grails => web-modules/grails}/grails-app/assets/stylesheets/mobile.css (100%) rename {grails => web-modules/grails}/grails-app/conf/application.yml (100%) rename {grails => web-modules/grails}/grails-app/conf/logback.groovy (100%) rename {grails => web-modules/grails}/grails-app/conf/spring/resources.groovy (100%) rename {grails => web-modules/grails}/grails-app/controllers/com/baeldung/grails/StudentController.groovy (100%) rename {grails => web-modules/grails}/grails-app/controllers/grails/UrlMappings.groovy (100%) rename {grails => web-modules/grails}/grails-app/domain/com/baeldung/grails/Student.groovy (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_cs.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_da.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_de.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_es.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_fr.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_it.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_ja.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_nb.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_nl.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_pl.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_pt_BR.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_pt_PT.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_ru.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_sk.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_sv.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_th.properties (100%) rename {grails => web-modules/grails}/grails-app/i18n/messages_zh_CN.properties (100%) rename {grails => web-modules/grails}/grails-app/init/grails/Application.groovy (100%) rename {grails => web-modules/grails}/grails-app/init/grails/BootStrap.groovy (100%) rename {grails => web-modules/grails}/grails-app/services/com/baeldung/grails/StudentService.groovy (100%) rename {grails => web-modules/grails}/grails-app/views/error.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/index.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/layouts/main.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/notFound.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/student/create.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/student/index.gsp (100%) rename {grails => web-modules/grails}/grails-app/views/student/show.gsp (100%) rename {grails => web-modules/grails}/grailsw (100%) rename {grails => web-modules/grails}/grailsw.bat (100%) rename {grails => web-modules/grails}/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy (100%) rename {grails => web-modules/grails}/src/integration-test/resources/GebConfig.groovy (100%) rename {grails => web-modules/grails}/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy (100%) diff --git a/pom.xml b/pom.xml index 07b9d6d842..64ef6697a0 100644 --- a/pom.xml +++ b/pom.xml @@ -349,7 +349,6 @@ - @@ -523,7 +522,6 @@ - diff --git a/grails/.gitignore b/web-modules/grails/.gitignore similarity index 100% rename from grails/.gitignore rename to web-modules/grails/.gitignore diff --git a/grails/README.md b/web-modules/grails/README.md similarity index 100% rename from grails/README.md rename to web-modules/grails/README.md diff --git a/grails/build.gradle b/web-modules/grails/build.gradle similarity index 100% rename from grails/build.gradle rename to web-modules/grails/build.gradle diff --git a/grails/gradle.properties b/web-modules/grails/gradle.properties similarity index 100% rename from grails/gradle.properties rename to web-modules/grails/gradle.properties diff --git a/grails/gradle/wrapper/gradle-wrapper.properties b/web-modules/grails/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from grails/gradle/wrapper/gradle-wrapper.properties rename to web-modules/grails/gradle/wrapper/gradle-wrapper.properties diff --git a/grails/gradlew b/web-modules/grails/gradlew similarity index 100% rename from grails/gradlew rename to web-modules/grails/gradlew diff --git a/grails/gradlew.bat b/web-modules/grails/gradlew.bat similarity index 100% rename from grails/gradlew.bat rename to web-modules/grails/gradlew.bat diff --git a/grails/grails-app/assets/images/apple-touch-icon-retina.png b/web-modules/grails/grails-app/assets/images/apple-touch-icon-retina.png similarity index 100% rename from grails/grails-app/assets/images/apple-touch-icon-retina.png rename to web-modules/grails/grails-app/assets/images/apple-touch-icon-retina.png diff --git a/grails/grails-app/assets/images/apple-touch-icon.png b/web-modules/grails/grails-app/assets/images/apple-touch-icon.png similarity index 100% rename from grails/grails-app/assets/images/apple-touch-icon.png rename to web-modules/grails/grails-app/assets/images/apple-touch-icon.png diff --git a/grails/grails-app/assets/images/favicon.ico b/web-modules/grails/grails-app/assets/images/favicon.ico similarity index 100% rename from grails/grails-app/assets/images/favicon.ico rename to web-modules/grails/grails-app/assets/images/favicon.ico diff --git a/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg b/web-modules/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg similarity index 100% rename from grails/grails-app/assets/images/grails-cupsonly-logo-white.svg rename to web-modules/grails/grails-app/assets/images/grails-cupsonly-logo-white.svg diff --git a/grails/grails-app/assets/images/grails.svg b/web-modules/grails/grails-app/assets/images/grails.svg similarity index 100% rename from grails/grails-app/assets/images/grails.svg rename to web-modules/grails/grails-app/assets/images/grails.svg diff --git a/grails/grails-app/assets/images/skin/database_add.png b/web-modules/grails/grails-app/assets/images/skin/database_add.png similarity index 100% rename from grails/grails-app/assets/images/skin/database_add.png rename to web-modules/grails/grails-app/assets/images/skin/database_add.png diff --git a/grails/grails-app/assets/images/skin/database_delete.png b/web-modules/grails/grails-app/assets/images/skin/database_delete.png similarity index 100% rename from grails/grails-app/assets/images/skin/database_delete.png rename to web-modules/grails/grails-app/assets/images/skin/database_delete.png diff --git a/grails/grails-app/assets/images/skin/database_edit.png b/web-modules/grails/grails-app/assets/images/skin/database_edit.png similarity index 100% rename from grails/grails-app/assets/images/skin/database_edit.png rename to web-modules/grails/grails-app/assets/images/skin/database_edit.png diff --git a/grails/grails-app/assets/images/skin/database_save.png b/web-modules/grails/grails-app/assets/images/skin/database_save.png similarity index 100% rename from grails/grails-app/assets/images/skin/database_save.png rename to web-modules/grails/grails-app/assets/images/skin/database_save.png diff --git a/grails/grails-app/assets/images/skin/database_table.png b/web-modules/grails/grails-app/assets/images/skin/database_table.png similarity index 100% rename from grails/grails-app/assets/images/skin/database_table.png rename to web-modules/grails/grails-app/assets/images/skin/database_table.png diff --git a/grails/grails-app/assets/images/skin/exclamation.png b/web-modules/grails/grails-app/assets/images/skin/exclamation.png similarity index 100% rename from grails/grails-app/assets/images/skin/exclamation.png rename to web-modules/grails/grails-app/assets/images/skin/exclamation.png diff --git a/grails/grails-app/assets/images/skin/house.png b/web-modules/grails/grails-app/assets/images/skin/house.png similarity index 100% rename from grails/grails-app/assets/images/skin/house.png rename to web-modules/grails/grails-app/assets/images/skin/house.png diff --git a/grails/grails-app/assets/images/skin/information.png b/web-modules/grails/grails-app/assets/images/skin/information.png similarity index 100% rename from grails/grails-app/assets/images/skin/information.png rename to web-modules/grails/grails-app/assets/images/skin/information.png diff --git a/grails/grails-app/assets/images/skin/shadow.jpg b/web-modules/grails/grails-app/assets/images/skin/shadow.jpg similarity index 100% rename from grails/grails-app/assets/images/skin/shadow.jpg rename to web-modules/grails/grails-app/assets/images/skin/shadow.jpg diff --git a/grails/grails-app/assets/images/skin/sorted_asc.gif b/web-modules/grails/grails-app/assets/images/skin/sorted_asc.gif similarity index 100% rename from grails/grails-app/assets/images/skin/sorted_asc.gif rename to web-modules/grails/grails-app/assets/images/skin/sorted_asc.gif diff --git a/grails/grails-app/assets/images/skin/sorted_desc.gif b/web-modules/grails/grails-app/assets/images/skin/sorted_desc.gif similarity index 100% rename from grails/grails-app/assets/images/skin/sorted_desc.gif rename to web-modules/grails/grails-app/assets/images/skin/sorted_desc.gif diff --git a/grails/grails-app/assets/images/spinner.gif b/web-modules/grails/grails-app/assets/images/spinner.gif similarity index 100% rename from grails/grails-app/assets/images/spinner.gif rename to web-modules/grails/grails-app/assets/images/spinner.gif diff --git a/grails/grails-app/assets/javascripts/application.js b/web-modules/grails/grails-app/assets/javascripts/application.js similarity index 100% rename from grails/grails-app/assets/javascripts/application.js rename to web-modules/grails/grails-app/assets/javascripts/application.js diff --git a/grails/grails-app/assets/javascripts/bootstrap.js b/web-modules/grails/grails-app/assets/javascripts/bootstrap.js similarity index 100% rename from grails/grails-app/assets/javascripts/bootstrap.js rename to web-modules/grails/grails-app/assets/javascripts/bootstrap.js diff --git a/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js b/web-modules/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js similarity index 100% rename from grails/grails-app/assets/javascripts/jquery-2.2.0.min.js rename to web-modules/grails/grails-app/assets/javascripts/jquery-2.2.0.min.js diff --git a/grails/grails-app/assets/stylesheets/application.css b/web-modules/grails/grails-app/assets/stylesheets/application.css similarity index 100% rename from grails/grails-app/assets/stylesheets/application.css rename to web-modules/grails/grails-app/assets/stylesheets/application.css diff --git a/grails/grails-app/assets/stylesheets/bootstrap.css b/web-modules/grails/grails-app/assets/stylesheets/bootstrap.css similarity index 100% rename from grails/grails-app/assets/stylesheets/bootstrap.css rename to web-modules/grails/grails-app/assets/stylesheets/bootstrap.css diff --git a/grails/grails-app/assets/stylesheets/errors.css b/web-modules/grails/grails-app/assets/stylesheets/errors.css similarity index 100% rename from grails/grails-app/assets/stylesheets/errors.css rename to web-modules/grails/grails-app/assets/stylesheets/errors.css diff --git a/grails/grails-app/assets/stylesheets/grails.css b/web-modules/grails/grails-app/assets/stylesheets/grails.css similarity index 100% rename from grails/grails-app/assets/stylesheets/grails.css rename to web-modules/grails/grails-app/assets/stylesheets/grails.css diff --git a/grails/grails-app/assets/stylesheets/main.css b/web-modules/grails/grails-app/assets/stylesheets/main.css similarity index 100% rename from grails/grails-app/assets/stylesheets/main.css rename to web-modules/grails/grails-app/assets/stylesheets/main.css diff --git a/grails/grails-app/assets/stylesheets/mobile.css b/web-modules/grails/grails-app/assets/stylesheets/mobile.css similarity index 100% rename from grails/grails-app/assets/stylesheets/mobile.css rename to web-modules/grails/grails-app/assets/stylesheets/mobile.css diff --git a/grails/grails-app/conf/application.yml b/web-modules/grails/grails-app/conf/application.yml similarity index 100% rename from grails/grails-app/conf/application.yml rename to web-modules/grails/grails-app/conf/application.yml diff --git a/grails/grails-app/conf/logback.groovy b/web-modules/grails/grails-app/conf/logback.groovy similarity index 100% rename from grails/grails-app/conf/logback.groovy rename to web-modules/grails/grails-app/conf/logback.groovy diff --git a/grails/grails-app/conf/spring/resources.groovy b/web-modules/grails/grails-app/conf/spring/resources.groovy similarity index 100% rename from grails/grails-app/conf/spring/resources.groovy rename to web-modules/grails/grails-app/conf/spring/resources.groovy diff --git a/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy b/web-modules/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy similarity index 100% rename from grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy rename to web-modules/grails/grails-app/controllers/com/baeldung/grails/StudentController.groovy diff --git a/grails/grails-app/controllers/grails/UrlMappings.groovy b/web-modules/grails/grails-app/controllers/grails/UrlMappings.groovy similarity index 100% rename from grails/grails-app/controllers/grails/UrlMappings.groovy rename to web-modules/grails/grails-app/controllers/grails/UrlMappings.groovy diff --git a/grails/grails-app/domain/com/baeldung/grails/Student.groovy b/web-modules/grails/grails-app/domain/com/baeldung/grails/Student.groovy similarity index 100% rename from grails/grails-app/domain/com/baeldung/grails/Student.groovy rename to web-modules/grails/grails-app/domain/com/baeldung/grails/Student.groovy diff --git a/grails/grails-app/i18n/messages.properties b/web-modules/grails/grails-app/i18n/messages.properties similarity index 100% rename from grails/grails-app/i18n/messages.properties rename to web-modules/grails/grails-app/i18n/messages.properties diff --git a/grails/grails-app/i18n/messages_cs.properties b/web-modules/grails/grails-app/i18n/messages_cs.properties similarity index 100% rename from grails/grails-app/i18n/messages_cs.properties rename to web-modules/grails/grails-app/i18n/messages_cs.properties diff --git a/grails/grails-app/i18n/messages_da.properties b/web-modules/grails/grails-app/i18n/messages_da.properties similarity index 100% rename from grails/grails-app/i18n/messages_da.properties rename to web-modules/grails/grails-app/i18n/messages_da.properties diff --git a/grails/grails-app/i18n/messages_de.properties b/web-modules/grails/grails-app/i18n/messages_de.properties similarity index 100% rename from grails/grails-app/i18n/messages_de.properties rename to web-modules/grails/grails-app/i18n/messages_de.properties diff --git a/grails/grails-app/i18n/messages_es.properties b/web-modules/grails/grails-app/i18n/messages_es.properties similarity index 100% rename from grails/grails-app/i18n/messages_es.properties rename to web-modules/grails/grails-app/i18n/messages_es.properties diff --git a/grails/grails-app/i18n/messages_fr.properties b/web-modules/grails/grails-app/i18n/messages_fr.properties similarity index 100% rename from grails/grails-app/i18n/messages_fr.properties rename to web-modules/grails/grails-app/i18n/messages_fr.properties diff --git a/grails/grails-app/i18n/messages_it.properties b/web-modules/grails/grails-app/i18n/messages_it.properties similarity index 100% rename from grails/grails-app/i18n/messages_it.properties rename to web-modules/grails/grails-app/i18n/messages_it.properties diff --git a/grails/grails-app/i18n/messages_ja.properties b/web-modules/grails/grails-app/i18n/messages_ja.properties similarity index 100% rename from grails/grails-app/i18n/messages_ja.properties rename to web-modules/grails/grails-app/i18n/messages_ja.properties diff --git a/grails/grails-app/i18n/messages_nb.properties b/web-modules/grails/grails-app/i18n/messages_nb.properties similarity index 100% rename from grails/grails-app/i18n/messages_nb.properties rename to web-modules/grails/grails-app/i18n/messages_nb.properties diff --git a/grails/grails-app/i18n/messages_nl.properties b/web-modules/grails/grails-app/i18n/messages_nl.properties similarity index 100% rename from grails/grails-app/i18n/messages_nl.properties rename to web-modules/grails/grails-app/i18n/messages_nl.properties diff --git a/grails/grails-app/i18n/messages_pl.properties b/web-modules/grails/grails-app/i18n/messages_pl.properties similarity index 100% rename from grails/grails-app/i18n/messages_pl.properties rename to web-modules/grails/grails-app/i18n/messages_pl.properties diff --git a/grails/grails-app/i18n/messages_pt_BR.properties b/web-modules/grails/grails-app/i18n/messages_pt_BR.properties similarity index 100% rename from grails/grails-app/i18n/messages_pt_BR.properties rename to web-modules/grails/grails-app/i18n/messages_pt_BR.properties diff --git a/grails/grails-app/i18n/messages_pt_PT.properties b/web-modules/grails/grails-app/i18n/messages_pt_PT.properties similarity index 100% rename from grails/grails-app/i18n/messages_pt_PT.properties rename to web-modules/grails/grails-app/i18n/messages_pt_PT.properties diff --git a/grails/grails-app/i18n/messages_ru.properties b/web-modules/grails/grails-app/i18n/messages_ru.properties similarity index 100% rename from grails/grails-app/i18n/messages_ru.properties rename to web-modules/grails/grails-app/i18n/messages_ru.properties diff --git a/grails/grails-app/i18n/messages_sk.properties b/web-modules/grails/grails-app/i18n/messages_sk.properties similarity index 100% rename from grails/grails-app/i18n/messages_sk.properties rename to web-modules/grails/grails-app/i18n/messages_sk.properties diff --git a/grails/grails-app/i18n/messages_sv.properties b/web-modules/grails/grails-app/i18n/messages_sv.properties similarity index 100% rename from grails/grails-app/i18n/messages_sv.properties rename to web-modules/grails/grails-app/i18n/messages_sv.properties diff --git a/grails/grails-app/i18n/messages_th.properties b/web-modules/grails/grails-app/i18n/messages_th.properties similarity index 100% rename from grails/grails-app/i18n/messages_th.properties rename to web-modules/grails/grails-app/i18n/messages_th.properties diff --git a/grails/grails-app/i18n/messages_zh_CN.properties b/web-modules/grails/grails-app/i18n/messages_zh_CN.properties similarity index 100% rename from grails/grails-app/i18n/messages_zh_CN.properties rename to web-modules/grails/grails-app/i18n/messages_zh_CN.properties diff --git a/grails/grails-app/init/grails/Application.groovy b/web-modules/grails/grails-app/init/grails/Application.groovy similarity index 100% rename from grails/grails-app/init/grails/Application.groovy rename to web-modules/grails/grails-app/init/grails/Application.groovy diff --git a/grails/grails-app/init/grails/BootStrap.groovy b/web-modules/grails/grails-app/init/grails/BootStrap.groovy similarity index 100% rename from grails/grails-app/init/grails/BootStrap.groovy rename to web-modules/grails/grails-app/init/grails/BootStrap.groovy diff --git a/grails/grails-app/services/com/baeldung/grails/StudentService.groovy b/web-modules/grails/grails-app/services/com/baeldung/grails/StudentService.groovy similarity index 100% rename from grails/grails-app/services/com/baeldung/grails/StudentService.groovy rename to web-modules/grails/grails-app/services/com/baeldung/grails/StudentService.groovy diff --git a/grails/grails-app/views/error.gsp b/web-modules/grails/grails-app/views/error.gsp similarity index 100% rename from grails/grails-app/views/error.gsp rename to web-modules/grails/grails-app/views/error.gsp diff --git a/grails/grails-app/views/index.gsp b/web-modules/grails/grails-app/views/index.gsp similarity index 100% rename from grails/grails-app/views/index.gsp rename to web-modules/grails/grails-app/views/index.gsp diff --git a/grails/grails-app/views/layouts/main.gsp b/web-modules/grails/grails-app/views/layouts/main.gsp similarity index 100% rename from grails/grails-app/views/layouts/main.gsp rename to web-modules/grails/grails-app/views/layouts/main.gsp diff --git a/grails/grails-app/views/notFound.gsp b/web-modules/grails/grails-app/views/notFound.gsp similarity index 100% rename from grails/grails-app/views/notFound.gsp rename to web-modules/grails/grails-app/views/notFound.gsp diff --git a/grails/grails-app/views/student/create.gsp b/web-modules/grails/grails-app/views/student/create.gsp similarity index 100% rename from grails/grails-app/views/student/create.gsp rename to web-modules/grails/grails-app/views/student/create.gsp diff --git a/grails/grails-app/views/student/index.gsp b/web-modules/grails/grails-app/views/student/index.gsp similarity index 100% rename from grails/grails-app/views/student/index.gsp rename to web-modules/grails/grails-app/views/student/index.gsp diff --git a/grails/grails-app/views/student/show.gsp b/web-modules/grails/grails-app/views/student/show.gsp similarity index 100% rename from grails/grails-app/views/student/show.gsp rename to web-modules/grails/grails-app/views/student/show.gsp diff --git a/grails/grailsw b/web-modules/grails/grailsw similarity index 100% rename from grails/grailsw rename to web-modules/grails/grailsw diff --git a/grails/grailsw.bat b/web-modules/grails/grailsw.bat similarity index 100% rename from grails/grailsw.bat rename to web-modules/grails/grailsw.bat diff --git a/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy b/web-modules/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy similarity index 100% rename from grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy rename to web-modules/grails/src/integration-test/groovy/com/baeldung/grails/StudentIntegrationSpec.groovy diff --git a/grails/src/integration-test/resources/GebConfig.groovy b/web-modules/grails/src/integration-test/resources/GebConfig.groovy similarity index 100% rename from grails/src/integration-test/resources/GebConfig.groovy rename to web-modules/grails/src/integration-test/resources/GebConfig.groovy diff --git a/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy b/web-modules/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy similarity index 100% rename from grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy rename to web-modules/grails/src/test/groovy/com/baeldung/grails/StudentControllerSpec.groovy diff --git a/web-modules/pom.xml b/web-modules/pom.xml index 684283b546..57810f90de 100644 --- a/web-modules/pom.xml +++ b/web-modules/pom.xml @@ -19,6 +19,7 @@ bootique dropwizard google-web-toolkit + jakarta-ee javax-servlets From 2b22ffc5eae54acbae886ff4849c95953e8c556d Mon Sep 17 00:00:00 2001 From: CHANDRAKANT Kumar Date: Sun, 29 Oct 2023 23:23:54 +0530 Subject: [PATCH 289/831] Fixed as par some more review comments. --- libraries-llms/README.md | 6 ------ .../com/baeldung/langchain/ChainWithDocumentLiveTest.java | 2 -- .../com/baeldung/langchain/ChatWithDocumentLiveTest.java | 2 -- .../java/com/baeldung/langchain/ChatWithMemoryLiveTest.java | 5 +---- .../com/baeldung/langchain/PromptTemplatesLiveTest.java | 2 -- .../com/baeldung/langchain/ServiceWithToolsLiveTest.java | 5 ----- 6 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 libraries-llms/README.md diff --git a/libraries-llms/README.md b/libraries-llms/README.md deleted file mode 100644 index 2e250d42d6..0000000000 --- a/libraries-llms/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Language Model Integration Libraries - -This module contains articles about libraries for language model integration in Java. - -### Relevant articles -- [Introduction to LangChain](https://www.baeldung.com/langchain) \ No newline at end of file diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java index 804a052990..eec7da99fd 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java @@ -31,7 +31,6 @@ public class ChainWithDocumentLiveTest { @Test public void givenChainWithDocument_whenPrompted_thenValidResponse() { - EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); EmbeddingStore embeddingStore = new InMemoryEmbeddingStore<>(); @@ -61,7 +60,6 @@ public class ChainWithDocumentLiveTest { logger.info(answer); assertNotNull(answer); - } } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java index 7ae50c6bc4..cbbcc7dd23 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java @@ -38,7 +38,6 @@ public class ChatWithDocumentLiveTest { @Test public void givenDocument_whenPrompted_thenValidResponse() { - Document document = loadDocument(Paths.get("src/test/resources/example-files/simpson's_adventures.txt")); DocumentSplitter splitter = DocumentSplitters.recursive(100, 0, new OpenAiTokenizer(GPT_3_5_TURBO)); List segments = splitter.split(document); @@ -77,7 +76,6 @@ public class ChatWithDocumentLiveTest { logger.info(aiMessage.text()); assertNotNull(aiMessage.text()); - } } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java index cae6a7930a..7a67c0be0e 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java @@ -22,7 +22,6 @@ public class ChatWithMemoryLiveTest { @Test public void givenMemory_whenPrompted_thenValidResponse() { - ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY); ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO)); @@ -38,9 +37,7 @@ public class ChatWithMemoryLiveTest { .content(); logger.info(answerWithName.text()); chatMemory.add(answerWithName); - assertThat(answerWithName.text() - .contains("Kumar")); - + assertThat(answerWithName.text()).contains("Kumar"); } } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java index 1350872eb1..b05727f15f 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java @@ -21,7 +21,6 @@ public class PromptTemplatesLiveTest { @Test public void givenPromptTemplate_whenSuppliedInput_thenValidResponse() { - PromptTemplate promptTemplate = PromptTemplate.from("Tell me a {{adjective}} joke about {{content}}.."); Map variables = new HashMap<>(); variables.put("adjective", "funny"); @@ -37,7 +36,6 @@ public class PromptTemplatesLiveTest { String response = model.generate(prompt.text()); logger.info(response); assertNotNull(response); - } } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java index 9d64d1fc97..1df08e6d35 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java @@ -16,7 +16,6 @@ public class ServiceWithToolsLiveTest { private static final Logger logger = LoggerFactory.getLogger(ServiceWithToolsLiveTest.class); static class Calculator { - @Tool("Calculates the length of a string") int stringLength(String s) { return s.length(); @@ -26,17 +25,14 @@ public class ServiceWithToolsLiveTest { int add(int a, int b) { return a + b; } - } interface Assistant { - String chat(String userMessage); } @Test public void givenServiceWithTools_whenPrompted_thenValidResponse() { - Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY)) .tools(new Calculator()) @@ -48,7 +44,6 @@ public class ServiceWithToolsLiveTest { logger.info(answer); assertThat(answer).contains("13"); - } } From b7edd335a9d45e6fb2fee37e50ffcd9a95ef032d Mon Sep 17 00:00:00 2001 From: Alvin Austria Date: Sun, 29 Oct 2023 19:14:06 +0100 Subject: [PATCH 290/831] Java 20557: Upgrade hibernate-ogm to JDK 11 (#15064) --- .../test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java | 1 + pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java index d7fd49d917..3903e272de 100644 --- a/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java +++ b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java @@ -22,6 +22,7 @@ public class EditorUnitTest { loadAndVerifyTestData(entityManagerFactory, editor); } */ + @Test public void givenNeo4j_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-neo4j"); diff --git a/pom.xml b/pom.xml index 64ef6697a0..7bde142fbc 100644 --- a/pom.xml +++ b/pom.xml @@ -361,7 +361,7 @@ muleesb web-modules/java-lite persistence-modules/deltaspike - persistence-modules/hibernate-ogm + persistence-modules/hibernate-ogm persistence-modules/spring-data-cassandra-reactive java-nashorn jeromq @@ -532,7 +532,7 @@ muleesb web-modules/java-lite persistence-modules/deltaspike - persistence-modules/hibernate-ogm + persistence-modules/hibernate-ogm persistence-modules/spring-data-cassandra-reactive java-nashorn jeromq From a127e7644e9166d2eba73aca0e4fef901d4dcf02 Mon Sep 17 00:00:00 2001 From: Manfred <77407079+manfred106@users.noreply.github.com> Date: Mon, 30 Oct 2023 00:56:52 +0000 Subject: [PATCH 291/831] BAEL-6804: Difference Between ZipFile and ZipInputStream in Java (#15039) * BAEL-6804: Difference Between ZipFile and ZipInputStream in Java * BAEL-6804: Difference Between ZipFile and ZipInputStream in Java - use 2-space indents for line continuations --- core-java-modules/core-java-io-5/pom.xml | 16 +++ .../java/com/baeldung/zip/ZipBenchmark.java | 112 ++++++++++++++++++ .../com/baeldung/zip/ZipSampleFileStore.java | 70 +++++++++++ .../java/com/baeldung/zip/ZipUnitTest.java | 83 +++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipBenchmark.java create mode 100644 core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipSampleFileStore.java create mode 100644 core-java-modules/core-java-io-5/src/test/java/com/baeldung/zip/ZipUnitTest.java diff --git a/core-java-modules/core-java-io-5/pom.xml b/core-java-modules/core-java-io-5/pom.xml index 11116b071c..5c987a82e1 100644 --- a/core-java-modules/core-java-io-5/pom.xml +++ b/core-java-modules/core-java-io-5/pom.xml @@ -35,6 +35,21 @@ simplemagic ${simplemagic.version} + + commons-io + commons-io + ${commons-io.version} + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -62,5 +77,6 @@ 0.1.5 6.2.1 1.17 + 1.37 \ No newline at end of file diff --git a/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipBenchmark.java b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipBenchmark.java new file mode 100644 index 0000000000..30ec1522a2 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipBenchmark.java @@ -0,0 +1,112 @@ +package com.baeldung.zip; + +import java.io.*; +import java.util.concurrent.TimeUnit; +import java.util.*; +import java.util.zip.*; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 1, time = 2, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Fork(value = 1) +public class ZipBenchmark { + + public static final int NUM_OF_FILES = 10; + public static final int DATA_SIZE = 204800; + + @State(Scope.Thread) + public static class SourceState { + + public File compressedFile; + + @Setup(Level.Trial) + public void setup() throws IOException { + ZipSampleFileStore sampleFileStore = new ZipSampleFileStore(NUM_OF_FILES, DATA_SIZE); + compressedFile = sampleFileStore.getFile(); + } + + @TearDown(Level.Trial) + public void cleanup() { + if (compressedFile.exists()) { + compressedFile.delete(); + } + } + } + + @Benchmark + public static void readAllEntriesByZipFile(SourceState sourceState, Blackhole blackhole) throws IOException { + + try (ZipFile zipFile = new ZipFile(sourceState.compressedFile)) { + Enumeration zipEntries = zipFile.entries(); + while (zipEntries.hasMoreElements()) { + ZipEntry zipEntry = zipEntries.nextElement(); + try (InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry))) { + blackhole.consume(ZipSampleFileStore.getString(inputStream)); + } + } + } + } + + @Benchmark + public static void readAllEntriesByZipInputStream(SourceState sourceState, Blackhole blackhole) throws IOException { + + try ( + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceState.compressedFile)); + ZipInputStream zipInputStream = new ZipInputStream(bis) + ) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + blackhole.consume(ZipSampleFileStore.getString(zipInputStream)); + } + } + } + + @Benchmark + public static void readLastEntryByZipFile(SourceState sourceState, Blackhole blackhole) throws IOException { + + try (ZipFile zipFile = new ZipFile(sourceState.compressedFile)) { + ZipEntry zipEntry = zipFile.getEntry(getLastEntryName()); + try (InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry))) { + blackhole.consume(ZipSampleFileStore.getString(inputStream)); + } + } + } + + @Benchmark + public static void readLastEntryByZipInputStream(SourceState sourceState, Blackhole blackhole) throws IOException { + + try ( + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceState.compressedFile)); + ZipInputStream zipInputStream = new ZipInputStream(bis) + ) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + if (Objects.equals(entry.getName(), getLastEntryName())){ + blackhole.consume(ZipSampleFileStore.getString(zipInputStream)); + } + } + } + } + + private static String getLastEntryName() { + return String.format(ZipSampleFileStore.ENTRY_NAME_PATTERN, NUM_OF_FILES); + } + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder() + .include(ZipBenchmark.class.getSimpleName()).threads(1) + .shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipSampleFileStore.java b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipSampleFileStore.java new file mode 100644 index 0000000000..389f082ff1 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/main/java/com/baeldung/zip/ZipSampleFileStore.java @@ -0,0 +1,70 @@ +package com.baeldung.zip; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.apache.commons.io.IOUtils; + +public class ZipSampleFileStore { + + public static final String ENTRY_NAME_PATTERN = "str-data-%s.txt"; + private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8; + + private final File file; + private final List dataList; + + public ZipSampleFileStore(int numOfFiles, int fileSize) throws IOException { + + dataList = new ArrayList<>(numOfFiles); + file = File.createTempFile("zip-sample", ""); + + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file))) { + + for (int idx=0; idx<=numOfFiles; idx++) { + + byte[] data = createRandomStringInByte(fileSize); + dataList.add(new String(data, DEFAULT_ENCODING)); + + ZipEntry entry = new ZipEntry(String.format(ENTRY_NAME_PATTERN, idx)); + zos.putNextEntry(entry); + zos.write(data); + zos.closeEntry(); + } + } + } + + public static byte[] createRandomStringInByte(int size) { + Random random = new Random(); + byte[] data = new byte[size]; + for (int n = 0; n < data.length; n++) { + char randomChar; + int choice = random.nextInt(2); // 0 for uppercase, 1 for lowercase + if (choice == 0) { + randomChar = (char) ('A' + random.nextInt(26)); // 'A' to 'Z' + } else { + randomChar = (char) ('a' + random.nextInt(26)); // 'a' to 'z' + } + data[n] = (byte) randomChar; + } + return data; + } + + public File getFile() { + return file; + } + + public List getDataList() { + return dataList; + } + + public static String getString(InputStream inputStream) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + IOUtils.copy(inputStream, byteArrayOutputStream); + return byteArrayOutputStream.toString(DEFAULT_ENCODING); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/zip/ZipUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/zip/ZipUnitTest.java new file mode 100644 index 0000000000..1d4d76dc41 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/zip/ZipUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.zip; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.*; +import java.util.*; +import java.util.zip.*; + +import org.junit.*; + +public class ZipUnitTest { + + private static File compressedFile; + private static List dataList = new ArrayList<>(); + + @BeforeClass + public static void prepareData() throws IOException { + ZipSampleFileStore sampleFileStore = new ZipSampleFileStore(ZipBenchmark.NUM_OF_FILES, ZipBenchmark.DATA_SIZE); + compressedFile = sampleFileStore.getFile(); + dataList = sampleFileStore.getDataList(); + } + + @Test + public void whenCreateZipFile_thenCompressedSizeShouldBeLessThanOriginal() throws IOException { + byte[] data = ZipSampleFileStore.createRandomStringInByte(10240); + File file = File.createTempFile("zip-temp", ""); + + try ( + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); + ZipOutputStream zos = new ZipOutputStream(bos) + ) { + ZipEntry zipEntry = new ZipEntry("zip-entry.txt"); + zos.putNextEntry(zipEntry); + zos.write(data); + zos.closeEntry(); + + assertThat(file.length()).isLessThan(data.length); + } + finally { + file.delete(); + } + } + + @Test + public void whenReadAllEntriesViaZipFile_thenDataIsEqualtoTheSource() throws IOException { + + try (ZipFile zipFile = new ZipFile(compressedFile)) { + Enumeration entries = zipFile.entries(); + List entryList = Collections.list(entries); + + for (int idx=0; idx Date: Mon, 30 Oct 2023 11:05:16 +0530 Subject: [PATCH 292/831] Corrected the name of a constant. --- .../java/com/baeldung/langchain/ChainWithDocumentLiveTest.java | 2 +- .../java/com/baeldung/langchain/ChatWithDocumentLiveTest.java | 2 +- .../java/com/baeldung/langchain/ChatWithMemoryLiveTest.java | 2 +- .../src/test/java/com/baeldung/langchain/Constants.java | 2 +- .../java/com/baeldung/langchain/PromptTemplatesLiveTest.java | 2 +- .../java/com/baeldung/langchain/ServiceWithToolsLiveTest.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java index eec7da99fd..39746ce810 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChainWithDocumentLiveTest.java @@ -45,7 +45,7 @@ public class ChainWithDocumentLiveTest { ingestor.ingest(document); ChatLanguageModel chatModel = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_AI_KEY) + .apiKey(Constants.OPENAI_API_KEY) .timeout(ofSeconds(60)) .build(); diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java index cbbcc7dd23..41540f4888 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithDocumentLiveTest.java @@ -68,7 +68,7 @@ public class ChatWithDocumentLiveTest { Prompt prompt = promptTemplate.apply(variables); ChatLanguageModel chatModel = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_AI_KEY) + .apiKey(Constants.OPENAI_API_KEY) .timeout(ofSeconds(60)) .build(); AiMessage aiMessage = chatModel.generate(prompt.toUserMessage()) diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java index 7a67c0be0e..3d265d3f3f 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ChatWithMemoryLiveTest.java @@ -22,7 +22,7 @@ public class ChatWithMemoryLiveTest { @Test public void givenMemory_whenPrompted_thenValidResponse() { - ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY); + ChatLanguageModel model = OpenAiChatModel.withApiKey(Constants.OPENAI_API_KEY); ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO)); chatMemory.add(userMessage("Hello, my name is Kumar")); diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java index b468b3a065..380415bf9c 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/Constants.java @@ -7,6 +7,6 @@ public class Constants { * registering for free at (https://platform.openai.com/signup) and then by navigating * to "Create new secret key" page at (https://platform.openai.com/account/api-keys). */ - public static String OPEN_AI_KEY = "demo"; //""; + public static String OPENAI_API_KEY = ""; } diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java index b05727f15f..cd2ea642ed 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/PromptTemplatesLiveTest.java @@ -28,7 +28,7 @@ public class PromptTemplatesLiveTest { Prompt prompt = promptTemplate.apply(variables); ChatLanguageModel model = OpenAiChatModel.builder() - .apiKey(Constants.OPEN_AI_KEY) + .apiKey(Constants.OPENAI_API_KEY) .modelName(GPT_3_5_TURBO) .temperature(0.3) .build(); diff --git a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java index 1df08e6d35..7ebfcba4df 100644 --- a/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java +++ b/libraries-llms/src/test/java/com/baeldung/langchain/ServiceWithToolsLiveTest.java @@ -34,7 +34,7 @@ public class ServiceWithToolsLiveTest { @Test public void givenServiceWithTools_whenPrompted_thenValidResponse() { Assistant assistant = AiServices.builder(Assistant.class) - .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPEN_AI_KEY)) + .chatLanguageModel(OpenAiChatModel.withApiKey(Constants.OPENAI_API_KEY)) .tools(new Calculator()) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build(); From dfd9baf8e0baced4172d6f55a27bb16ceb7ac57a Mon Sep 17 00:00:00 2001 From: anujgaud <146576725+anujgaud@users.noreply.github.com> Date: Mon, 30 Oct 2023 13:50:16 +0530 Subject: [PATCH 293/831] Formatted UnicodeLetterChecker.java --- .../main/java/com/baeldung/unicode/UnicodeLetterChecker.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java index df561c88ea..8ac8671586 100644 --- a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/unicode/UnicodeLetterChecker.java @@ -13,15 +13,18 @@ public class UnicodeLetterChecker { } return true; } + public boolean regexCheck(String input) { Pattern pattern = Pattern.compile("^\\p{L}+$"); Matcher matcher = pattern.matcher(input); return matcher.matches(); } + public boolean isAlphaCheck(String input) { return StringUtils.isAlpha(input); } - public boolean StreamsCheck(String input){ + + public boolean StreamsCheck(String input) { return input.codePoints().allMatch(Character::isLetter); } } From de7dadabef623904f0a8687aaab75d2cfc94d6cc Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:23:12 +0100 Subject: [PATCH 294/831] BAEL-7108: Comparing Arrays Using compare() Method in Java (#14975) --- .../pom.xml | 4 +++ .../arraycompare/ArraysCompareUnitTest.java | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycompare/ArraysCompareUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index cbcd6ae440..52787cc0c9 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -57,5 +57,9 @@ + + + 11 + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycompare/ArraysCompareUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycompare/ArraysCompareUnitTest.java new file mode 100644 index 0000000000..828560d71c --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arraycompare/ArraysCompareUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.arraycompare; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +class ArraysCompareUnitTest { + + @Test + void givenSameContents_whenCompare_thenCorrect() { + String[] array1 = new String[] { "A", "B", "C" }; + String[] array2 = new String[] { "A", "B", "C" }; + + assertThat(Arrays.compare(array1, array2)).isEqualTo(0); + } + + @Test + void givenDifferentContents_whenCompare_thenDifferent() { + String[] array1 = new String[] { "A", "B", "C" }; + String[] array2 = new String[] { "A", "C", "B", "D" }; + + assertThat(Arrays.compare(array1, array2)).isLessThan(0); + assertThat(Arrays.compare(array2, array1)).isGreaterThan(0); + assertThat(Arrays.compare(array1, null)).isGreaterThan(0); + } + +} From 49929794b8db2ca20239b2dea47b07a3573a468f Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:42:44 +0100 Subject: [PATCH 295/831] BAEL-7111: Get First Date of Current Month in Java (#15023) --- .../FirstDayOfMonthUnitTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/firstdaymonth/FirstDayOfMonthUnitTest.java diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/firstdaymonth/FirstDayOfMonthUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/firstdaymonth/FirstDayOfMonthUnitTest.java new file mode 100644 index 0000000000..9edc3e4a8d --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/firstdaymonth/FirstDayOfMonthUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.firstdaymonth; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.temporal.TemporalAdjusters; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +import org.junit.jupiter.api.Test; + +public class FirstDayOfMonthUnitTest { + + @Test + void givenMonth_whenUsingCalendar_thenReturnFirstDay() { + Date currentDate = new GregorianCalendar(2023, Calendar.NOVEMBER, 23).getTime(); + Date expectedDate = new GregorianCalendar(2023, Calendar.NOVEMBER, 1).getTime(); + + Calendar cal = Calendar.getInstance(); + cal.setTime(currentDate); + cal.set(Calendar.DAY_OF_MONTH, 1); + + assertEquals(expectedDate, cal.getTime()); + } + + @Test + void givenMonth_whenUsingLocalDate_thenReturnFirstDay() { + LocalDate currentDate = LocalDate.of(2023, 9, 6); + LocalDate expectedDate = LocalDate.of(2023, 9, 1); + + assertEquals(expectedDate, currentDate.withDayOfMonth(1)); + } + + @Test + void givenMonth_whenUsingTemporalAdjusters_thenReturnFirstDay() { + LocalDate currentDate = LocalDate.of(2023, 7, 19); + LocalDate expectedDate = LocalDate.of(2023, 7, 1); + + assertEquals(expectedDate, currentDate.with(TemporalAdjusters.firstDayOfMonth())); + } + + @Test + void givenMonth_whenUsingYearMonth_thenReturnFirstDay() { + YearMonth currentDate = YearMonth.of(2023, 4); + LocalDate expectedDate = LocalDate.of(2023, 4, 1); + + assertEquals(expectedDate, currentDate.atDay(1)); + } + + @Test + void givenMonth_whenUsingJodaTime_thenReturnFirstDay() { + org.joda.time.LocalDate currentDate = org.joda.time.LocalDate.parse("2023-5-10"); + org.joda.time.LocalDate expectedDate = org.joda.time.LocalDate.parse("2023-5-1"); + + assertEquals(expectedDate, currentDate.dayOfMonth() + .withMinimumValue()); + } + +} From 7343754f159864c44ab65c9f187d876d4758a1cd Mon Sep 17 00:00:00 2001 From: Mikhail Polivakha <68962645+Mikhail2048@users.noreply.github.com> Date: Mon, 30 Oct 2023 20:20:48 +0300 Subject: [PATCH 296/831] BAEL-7139 implemented (#15082) --- spring-boot-modules/spring-boot-3-2/pom.xml | 34 ++++++++- .../ConditionalOnThreadingUnitTest.java | 70 +++++++++++++++++++ 2 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/conditionalonthreading/ConditionalOnThreadingUnitTest.java diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index 9e73d8ea32..276659c609 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -15,6 +15,14 @@ ../../parent-boot-3 + + + repository.spring.release + Spring GA Repository + https://repo.spring.io/milestone + + + org.springframework.boot @@ -94,6 +102,17 @@ org.springframework.boot spring-boot-starter-test + 3.2.0-M2 + + + org.junit.jupiter + junit-jupiter + 5.10.0 + + + org.junit.jupiter + junit-jupiter-api + 5.10.0 org.postgresql @@ -175,6 +194,18 @@ + + + + org.springframework.boot + spring-boot-dependencies + 3.2.0-M2 + import + pom + + + + @@ -244,9 +275,6 @@ org.apache.maven.plugins maven-compiler-plugin - - --enable-preview - diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/conditionalonthreading/ConditionalOnThreadingUnitTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/conditionalonthreading/ConditionalOnThreadingUnitTest.java new file mode 100644 index 0000000000..ed65769954 --- /dev/null +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/conditionalonthreading/ConditionalOnThreadingUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.conditionalonthreading; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; +import org.springframework.boot.autoconfigure.condition.ConditionalOnThreading; +import org.springframework.boot.autoconfigure.thread.Threading; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +public class ConditionalOnThreadingUnitTest { + + ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner() + .withUserConfiguration(CurrentConfig.class); + + @Configuration + static class CurrentConfig { + + @Bean + @ConditionalOnThreading(Threading.PLATFORM) + ThreadingType platformBean() { + return ThreadingType.PLATFORM; + } + + @Bean + @ConditionalOnThreading(Threading.VIRTUAL) + ThreadingType virtualBean() { + return ThreadingType.VIRTUAL; + } + } + + enum ThreadingType { + PLATFORM, VIRTUAL + } + + @Test + @EnabledForJreRange(max = JRE.JAVA_20) + public void whenJava20AndVirtualThreadsEnabled_thenThreadingIsPlatform() { + applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=true").run(context -> { + Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.PLATFORM); + }); + } + + @Test + @EnabledForJreRange(max = JRE.JAVA_20) + public void whenJava20AndVirtualThreadsDisabled_thenThreadingIsPlatform() { + applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=false").run(context -> { + Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.PLATFORM); + }); + } + + @Test + @EnabledForJreRange(min = JRE.JAVA_21) + public void whenJava21AndVirtualThreadsEnabled_thenThreadingIsVirtual() { + applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=true").run(context -> { + Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.VIRTUAL); + }); + } + + @Test + @EnabledForJreRange(min = JRE.JAVA_21) + public void whenJava21AndVirtualThreadsDisabled_thenThreadingIsPlatform() { + applicationContextRunner.withPropertyValues("spring.threads.virtual.enabled=false").run(context -> { + Assertions.assertThat(context.getBean(ThreadingType.class)).isEqualTo(ThreadingType.PLATFORM); + }); + } + +} \ No newline at end of file From d5c1b161bb5331472cf67c33cf46c0b7aeec8d45 Mon Sep 17 00:00:00 2001 From: kasramp Date: Mon, 30 Oct 2023 21:42:36 +0100 Subject: [PATCH 297/831] JAVA-25491 better variable naming AVL Tree insert method --- .../main/java/com/baeldung/avltree/AVLTree.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data-structures/src/main/java/com/baeldung/avltree/AVLTree.java b/data-structures/src/main/java/com/baeldung/avltree/AVLTree.java index ca0cfce7b4..117a35e028 100644 --- a/data-structures/src/main/java/com/baeldung/avltree/AVLTree.java +++ b/data-structures/src/main/java/com/baeldung/avltree/AVLTree.java @@ -42,17 +42,17 @@ public class AVLTree { return root == null ? -1 : root.height; } - private Node insert(Node node, int key) { - if (node == null) { + private Node insert(Node root, int key) { + if (root == null) { return new Node(key); - } else if (node.key > key) { - node.left = insert(node.left, key); - } else if (node.key < key) { - node.right = insert(node.right, key); + } else if (root.key > key) { + root.left = insert(root.left, key); + } else if (root.key < key) { + root.right = insert(root.right, key); } else { throw new RuntimeException("duplicate Key!"); } - return rebalance(node); + return rebalance(root); } private Node delete(Node node, int key) { From 6e25eb35cc11740b71c1d72419de85fa5420fb5a Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Tue, 31 Oct 2023 05:06:00 +0100 Subject: [PATCH 298/831] Add Spring StringUtils class (#15090) * Add Spring StringUtils class * Add Spring StringUtils class --- .../core-java-string-operations-2/pom.xml | 6 ++++++ .../emptystrings/EmptyStringsUnitTest.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index c6debc4f71..902e8f09b4 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -54,6 +54,11 @@ commons-codec ${commons-codec.version} + + org.springframework + spring-core + ${spring-core.version} + @@ -95,6 +100,7 @@ 3.0.0 2.2.6 1.14 + 5.3.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java index d772c38341..9652e0e770 100644 --- a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java +++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.emptystrings; import com.google.common.base.Strings; import org.apache.commons.lang3.StringUtils; import org.junit.Test; +import org.springframework.util.ObjectUtils; import javax.validation.ConstraintViolation; import javax.validation.Validation; @@ -109,6 +110,24 @@ public class EmptyStringsUnitTest { assertFalse(Strings.isNullOrEmpty(blankString)); } + /* + * Spring Core ObjectUtils + */ + @Test + public void givenSomeEmptyString_thenObjectUtilsIsEmptyReturnsTrue() { + assertTrue(ObjectUtils.isEmpty(emptyString)); + } + + @Test + public void givenSomeNonEmptyString_thenObjectUtilsIsEmptyReturnsFalse() { + assertFalse(ObjectUtils.isEmpty(nonEmptyString)); + } + + @Test + public void givenSomeBlankString_thenObjectUtilsIsEmptyReturnsFalse() { + assertFalse(ObjectUtils.isEmpty(blankString)); + } + /* * Bean Validation */ From a567d3187141f582d891442bb09ec935ec1dcfcd Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 31 Oct 2023 18:15:47 +0700 Subject: [PATCH 299/831] add some methods --- .../com/baeldung/uuid/UUIDLongGenerator.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java new file mode 100644 index 0000000000..8ac71b1ce6 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java @@ -0,0 +1,58 @@ +package com.baeldung.uuid; + +import java.nio.ByteBuffer; +import java.util.UUID; + +public class UUIDLongGenerator { + public long getLeastSignificantBits(){ + return UUID.randomUUID().getLeastSignificantBits(); + } + + public long getMostSignificantBits(){ + return UUID.randomUUID().getMostSignificantBits(); + } + + public long gethashCode(){ + return UUID.randomUUID().toString().hashCode(); + } + + public long combineByteBuffer(){ + UUID uuid = UUID.randomUUID(); + ByteBuffer bb = ByteBuffer.wrap(new byte[16]); + bb.putLong(uuid.getMostSignificantBits()); + bb.putLong(uuid.getLeastSignificantBits()); + bb.rewind(); // Kembalikan posisi buffer ke awal + return bb.getLong(); + } + + public long combineBitwise(){ + UUID uniqueUUID; + uniqueUUID = UUID.randomUUID(); + return (uniqueUUID.getMostSignificantBits() << 32) | (uniqueUUID.getLeastSignificantBits() & 0xFFFFFFFFL); + } + + public long combineDirect(){ + UUID uniqueUUID = UUID.randomUUID(); + long mostSignificantBits = uniqueUUID.getMostSignificantBits(); + long leastSignificantBits = uniqueUUID.getLeastSignificantBits(); + return mostSignificantBits ^ (leastSignificantBits >> 1); + } + + public long combinePermutation(){ + UUID uuid = UUID.randomUUID(); + long mostSigBits = uuid.getMostSignificantBits(); + long leastSigBits = uuid.getLeastSignificantBits(); + byte[] uuidBytes = new byte[16]; + + for (int i = 0; i < 8; i++) { + uuidBytes[i] = (byte) (mostSigBits >>> (8 * (7 - i))); + uuidBytes[i + 8] = (byte) (leastSigBits >>> (8 * (7 - i))); + } + + long result = 0; + for (byte b : uuidBytes) { + result = (result << 8) | (b & 0xFF); + } + return result; + } +} From ece5cdeb6ee96e85f29d556ed080f7ce13e8a2f8 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Tue, 31 Oct 2023 18:17:54 +0700 Subject: [PATCH 300/831] add unit test --- .../uuid/UUIDLongGeneratorUnitTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java new file mode 100644 index 0000000000..24add0a14a --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.uuid; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.text.DecimalFormat; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class UUIDLongGeneratorUnitTest { + final static int n = 1000000; + UUIDLongGenerator uuidLongGenerator = new UUIDLongGenerator(); + + @Test + void whenForeachGenerateLongValue_thenCollisionsCheck() { + printTableHeader(); + for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { + collisionAndNegativeCheck(method); + } + } + + private void printTableHeader() { + System.out.format("%-30s %-15s %-15s %-15s %-15s%n", "Approach", "collisions", "negatives", "collision", "negative"); + System.out.format("%-30s %-15s %-15s %-15s %-15s%n", "(method name)", "count", "count", "probability", "probability"); + System.out.println("--------------------------------------------------------------------------------------------"); + } + + private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { + DecimalFormat decimalFormat = new DecimalFormat("#.#####"); + System.out.format("%-30s %-15s %-15s %-15s %-15s%n", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability)); + } + + private void collisionAndNegativeCheck(Method method) { + Set uniqueValues = new HashSet<>(); + AtomicInteger collisions = new AtomicInteger(0); + AtomicInteger negative = new AtomicInteger(0); + + IntStream.range(0, n).forEach(i -> { + try { + long uniqueValue = (long) method.invoke(uuidLongGenerator); + if (!uniqueValues.add(uniqueValue)) { + collisions.incrementAndGet(); + } + if (uniqueValue < 0) { + negative.incrementAndGet(); + } + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + }); + + double collisionsProbability = (double) collisions.get() / n; + double negativeProbability = (double) negative.get() / n; + printOutput(method.getName(), collisions.get(), negative.get(), collisionsProbability, negativeProbability); + + assertTrue(collisionsProbability <= 0.001); // threshold = 0.001 + } +} From 832584c68cdeadbb14cf17ee11ca215bfa4bfb40 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 31 Oct 2023 20:37:18 +0530 Subject: [PATCH 301/831] JAVA-26280 Improve libraries-testing module build time --- .../{SmurfsArchUnitTest.java => SmurfsArchManualTest.java} | 2 +- ...erStatusIntegrationTest.java => MemberStatusManualTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename libraries-testing/src/test/java/com/baeldung/archunit/smurfs/{SmurfsArchUnitTest.java => SmurfsArchManualTest.java} (98%) rename libraries-testing/src/test/java/com/baeldung/serenity/{MemberStatusIntegrationTest.java => MemberStatusManualTest.java} (98%) diff --git a/libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchUnitTest.java b/libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchManualTest.java similarity index 98% rename from libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchUnitTest.java rename to libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchManualTest.java index 9724c2bcae..7db104bd57 100644 --- a/libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/archunit/smurfs/SmurfsArchManualTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -public class SmurfsArchUnitTest { +public class SmurfsArchManualTest { @Test public void givenPresentationLayerClasses_thenWrongCheckFails() { diff --git a/libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java b/libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusManualTest.java similarity index 98% rename from libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java rename to libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusManualTest.java index e95b63aa96..ec5346d27b 100644 --- a/libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java +++ b/libraries-testing/src/test/java/com/baeldung/serenity/MemberStatusManualTest.java @@ -14,7 +14,7 @@ import static com.baeldung.serenity.membership.MemberGrade.Gold; import static com.baeldung.serenity.membership.MemberGrade.Silver; @RunWith(SerenityRunner.class) -public class MemberStatusIntegrationTest { +public class MemberStatusManualTest { @Steps private MemberStatusSteps memberSteps; From 036369c792924306bb7f08caa812863cad14920c Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Tue, 31 Oct 2023 16:21:05 +0100 Subject: [PATCH 302/831] BAEL-6705: Fixed typo (#15015) --- .../baeldung/alphanumeric/AlphanumericPerformanceBenchmark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/alphanumeric/AlphanumericPerformanceBenchmark.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/alphanumeric/AlphanumericPerformanceBenchmark.java index 4b2ecc4c4d..0525153ed9 100644 --- a/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/alphanumeric/AlphanumericPerformanceBenchmark.java +++ b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/alphanumeric/AlphanumericPerformanceBenchmark.java @@ -85,7 +85,7 @@ public class AlphanumericPerformanceBenchmark { public boolean isAlphanumeric(final int codePoint) { return (codePoint >= 65 && codePoint <= 90) || - (codePoint >= 97 && codePoint <= 172) || + (codePoint >= 97 && codePoint <= 122) || (codePoint >= 48 && codePoint <= 57); } } From 44aea845c9dfb11da3075adea740410461079e9f Mon Sep 17 00:00:00 2001 From: gaepi Date: Tue, 31 Oct 2023 18:41:10 +0100 Subject: [PATCH 303/831] JAVA-18614 | fixing log-out. --- .../com/baeldung/saml/SecurityConfig.java | 8 ++--- .../src/main/resources/application.yml | 2 +- .../resources/metadata/metadata-idp-okta.xml | 34 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java b/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java index 9078953d02..524cb3b0bc 100644 --- a/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java +++ b/spring-security-modules/spring-security-saml2/src/main/java/com/baeldung/saml/SecurityConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.saml2.provider.service.metadata.OpenSamlMetadataResolver; import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository; import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver; @@ -25,10 +26,9 @@ public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { DefaultRelyingPartyRegistrationResolver relyingPartyRegistrationResolver = new DefaultRelyingPartyRegistrationResolver(this.relyingPartyRegistrationRepository); - Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver()); - - http.authorizeHttpRequests(authorize -> authorize.anyRequest() - .authenticated()) + Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver()); + + http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()) .saml2Login(withDefaults()) .saml2Logout(withDefaults()) .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class); diff --git a/spring-security-modules/spring-security-saml2/src/main/resources/application.yml b/spring-security-modules/spring-security-saml2/src/main/resources/application.yml index 75b9612b47..a9adbf6212 100644 --- a/spring-security-modules/spring-security-saml2/src/main/resources/application.yml +++ b/spring-security-modules/spring-security-saml2/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: - private-key-location: classpath:local.key certificate-location: classpath:local.crt singlelogout: - url: https://dev-56617222.okta.com/app/dev-56617222_springbootsaml_1/exk8b5jr6vYQqVXp45d7/slo/saml + url: https://dev-92830632.okta.com/app/dev-92830632_baeldungspringsecuritysaml2app_1/exkd0u28geAHN4ViI5d7/slo/saml binding: POST response-url: "{baseUrl}/logout/saml2/slo" assertingparty: diff --git a/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml b/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml index 83976805c4..675aa4be2f 100644 --- a/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml +++ b/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml @@ -1,17 +1,17 @@ -MIIDqDCCApCgAwIBAgIGAYZ6plFwMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYDVQQGEwJVUzETMBEG -A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU -MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi01NjYxNzIyMjEcMBoGCSqGSIb3DQEJ -ARYNaW5mb0Bva3RhLmNvbTAeFw0yMzAyMjIxOTQxNDVaFw0zMzAyMjIxOTQyNDVaMIGUMQswCQYD -VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG -A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi01NjYxNzIyMjEc -MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMCoER+Qlx6xBBUAcIxRk5ItmfldF+Rc+z+FCY/Ow7+cNBOIenRGfQLirQMwKzvZAg2o52xm -OrtqsHX3NLEnSQDyQp/sE7MueHQCGcDnCAQEeOVbDSPW7bDOeK/qNyecTPKZreL70TQLPpeA9x7l -WA59zxOX9or9BLuQJrXKOU/cZ4BXzue351R2qmuj7IqbXmsbetKegVFShYJZ9e9ta42OK1T8oDez -dKZbPj5el1kj2jJ08GzO3TDg9j5B21x3sz2bxg6vFMP7e10hgLicxKVw1P5ZG995wUA+E8YbFehi -YXRlcJiiKhmjRvHFl1F5vM4DPLaL4b8BJ1E21Byhb2cCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA -FMy00eWU4klEdV2PhoOPZE8Phj6tVDtEjr+ol7L7RJh6u2WPwLm6U9vE9wQ0/OYhOjThUsZqxqjL -SqhZeMiFwohL6K5cmW2wTkxgfICyPY9g3BVDtogsZgbI0clIG5slwgiy9Kn7wQpSHWDvpEZXwmyV -KodcWIpgBf0dUdBhsx+o34eG7ajsLb9HEisF0ntxlKdG2LJqlkJBtiUgI2Wo2jNshfzA7Cp9cNio -+j3f1dwyWmmwWkyxGkEw8UwuwKMDHfuAwyBmZJmmG9zkHMlHkgQxxq3iI8Bs9E3lKYXtwLE7K+xe -rTdWegAfIP7LXC3JKN1N/Meke5FJLXmWAMXKIw==urn:oasis:names:tc:SAML:1.1:nameid-format:unspecifiedurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress \ No newline at end of file +MIIDqDCCApCgAwIBAgIGAYuBc2vlMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYDVQQGEwJVUzETMBEG + A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU + MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05MjgzMDYzMjEcMBoGCSqGSIb3DQEJ + ARYNaW5mb0Bva3RhLmNvbTAeFw0yMzEwMzAxNjM3MjdaFw0zMzEwMzAxNjM4MjZaMIGUMQswCQYD + VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG + A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05MjgzMDYzMjEc + MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC + ggEBAJqFFWDXTf0mCTQ0U781/jRMzuRqNAwaskN0obVXXSjtXmbXcdUWJO1P037zvQuR/53BEK+Y + kDQvqgCdL5E/IlPm1nlZoaZ5sobNvQJaTfY5RUlFO0wKW2kwOyPA2yey8r3yfETuyqmzOWjFlli1 + 77mHRCsSBPrFPYxUrCgosT1gdTarb5ZmepyB5jszhRmKDgRL0SSdsGlW05nWjp0GJlW9wzBJd+fD + MoWY9l4bDBCB+UgpiZ+78Yo6w01JAByJdm6+t00iqEQweNBZPXHaJ48GgIAKpqZqRBu+ZgkFFfXa + kof3RutsTLwxtVuzJ6I4SeiOtxTES+GiMj0d8eHwUbUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA + Spx5Vag/UES0TB09fBwXW5NYMykDdBRo1/aP/pKsBZdvzMv70hjPYFS699i9EX++i2WpAcr/Cht7 + NM+VdOgY7ZaQM5c6djYu1thByrCVzY1LuK6OnfE/x6RzeHUNdfqJHU5P9FVJbt74Vu22qKoA7uxW + sGbDHGyGyTYHj0udMOrTP9EFkhNqvkcvqJLLES/03ylMA79n00PH3qvjSZQJHardnYYtqboezbvs + PFJvxzAhh6l+tmseQx42uSB2xF3rKcF40i/h1AfX1e6hlRyG2enjQb7h8WpX1JOk6Sbbbz4xKFtO + vTjrqbvR9K5LdSFJddaE5U/WFYbRIQeW1T2y9A==urn:oasis:names:tc:SAML:1.1:nameid-format:unspecifiedurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress \ No newline at end of file From f49e4d934964aeea4948947bfc296e5a10bd2071 Mon Sep 17 00:00:00 2001 From: gaepi Date: Tue, 31 Oct 2023 18:44:49 +0100 Subject: [PATCH 304/831] JAVA-18614 | fixing log-out. --- .../src/main/resources/application.yml | 2 +- .../resources/metadata/metadata-idp-okta.xml | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-security-modules/spring-security-saml2/src/main/resources/application.yml b/spring-security-modules/spring-security-saml2/src/main/resources/application.yml index a9adbf6212..75b9612b47 100644 --- a/spring-security-modules/spring-security-saml2/src/main/resources/application.yml +++ b/spring-security-modules/spring-security-saml2/src/main/resources/application.yml @@ -9,7 +9,7 @@ spring: - private-key-location: classpath:local.key certificate-location: classpath:local.crt singlelogout: - url: https://dev-92830632.okta.com/app/dev-92830632_baeldungspringsecuritysaml2app_1/exkd0u28geAHN4ViI5d7/slo/saml + url: https://dev-56617222.okta.com/app/dev-56617222_springbootsaml_1/exk8b5jr6vYQqVXp45d7/slo/saml binding: POST response-url: "{baseUrl}/logout/saml2/slo" assertingparty: diff --git a/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml b/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml index 675aa4be2f..785effccc6 100644 --- a/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml +++ b/spring-security-modules/spring-security-saml2/src/main/resources/metadata/metadata-idp-okta.xml @@ -1,17 +1,17 @@ -MIIDqDCCApCgAwIBAgIGAYuBc2vlMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYDVQQGEwJVUzETMBEG +MIIDqDCCApCgAwIBAgIGAYZ6plFwMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYDVQQGEwJVUzETMBEG A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU - MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05MjgzMDYzMjEcMBoGCSqGSIb3DQEJ - ARYNaW5mb0Bva3RhLmNvbTAeFw0yMzEwMzAxNjM3MjdaFw0zMzEwMzAxNjM4MjZaMIGUMQswCQYD + MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi01NjYxNzIyMjEcMBoGCSqGSIb3DQEJ + ARYNaW5mb0Bva3RhLmNvbTAeFw0yMzAyMjIxOTQxNDVaFw0zMzAyMjIxOTQyNDVaMIGUMQswCQYD VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG - A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05MjgzMDYzMjEc + A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi01NjYxNzIyMjEc MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC - ggEBAJqFFWDXTf0mCTQ0U781/jRMzuRqNAwaskN0obVXXSjtXmbXcdUWJO1P037zvQuR/53BEK+Y - kDQvqgCdL5E/IlPm1nlZoaZ5sobNvQJaTfY5RUlFO0wKW2kwOyPA2yey8r3yfETuyqmzOWjFlli1 - 77mHRCsSBPrFPYxUrCgosT1gdTarb5ZmepyB5jszhRmKDgRL0SSdsGlW05nWjp0GJlW9wzBJd+fD - MoWY9l4bDBCB+UgpiZ+78Yo6w01JAByJdm6+t00iqEQweNBZPXHaJ48GgIAKpqZqRBu+ZgkFFfXa - kof3RutsTLwxtVuzJ6I4SeiOtxTES+GiMj0d8eHwUbUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA - Spx5Vag/UES0TB09fBwXW5NYMykDdBRo1/aP/pKsBZdvzMv70hjPYFS699i9EX++i2WpAcr/Cht7 - NM+VdOgY7ZaQM5c6djYu1thByrCVzY1LuK6OnfE/x6RzeHUNdfqJHU5P9FVJbt74Vu22qKoA7uxW - sGbDHGyGyTYHj0udMOrTP9EFkhNqvkcvqJLLES/03ylMA79n00PH3qvjSZQJHardnYYtqboezbvs - PFJvxzAhh6l+tmseQx42uSB2xF3rKcF40i/h1AfX1e6hlRyG2enjQb7h8WpX1JOk6Sbbbz4xKFtO - vTjrqbvR9K5LdSFJddaE5U/WFYbRIQeW1T2y9A==urn:oasis:names:tc:SAML:1.1:nameid-format:unspecifiedurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress \ No newline at end of file + ggEBAMCoER+Qlx6xBBUAcIxRk5ItmfldF+Rc+z+FCY/Ow7+cNBOIenRGfQLirQMwKzvZAg2o52xm + OrtqsHX3NLEnSQDyQp/sE7MueHQCGcDnCAQEeOVbDSPW7bDOeK/qNyecTPKZreL70TQLPpeA9x7l + WA59zxOX9or9BLuQJrXKOU/cZ4BXzue351R2qmuj7IqbXmsbetKegVFShYJZ9e9ta42OK1T8oDez + dKZbPj5el1kj2jJ08GzO3TDg9j5B21x3sz2bxg6vFMP7e10hgLicxKVw1P5ZG995wUA+E8YbFehi + YXRlcJiiKhmjRvHFl1F5vM4DPLaL4b8BJ1E21Byhb2cCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA + FMy00eWU4klEdV2PhoOPZE8Phj6tVDtEjr+ol7L7RJh6u2WPwLm6U9vE9wQ0/OYhOjThUsZqxqjL + SqhZeMiFwohL6K5cmW2wTkxgfICyPY9g3BVDtogsZgbI0clIG5slwgiy9Kn7wQpSHWDvpEZXwmyV + KodcWIpgBf0dUdBhsx+o34eG7ajsLb9HEisF0ntxlKdG2LJqlkJBtiUgI2Wo2jNshfzA7Cp9cNio + +j3f1dwyWmmwWkyxGkEw8UwuwKMDHfuAwyBmZJmmG9zkHMlHkgQxxq3iI8Bs9E3lKYXtwLE7K+xe + rTdWegAfIP7LXC3JKN1N/Meke5FJLXmWAMXKIw==urn:oasis:names:tc:SAML:1.1:nameid-format:unspecifiedurn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress \ No newline at end of file From 0422349dabb4fd6c1e4b53c4c5d60834fbf827f2 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Tue, 31 Oct 2023 18:07:06 +0000 Subject: [PATCH 305/831] BAEL-7088: Code for Connect 4 Article (#15099) * BAEL-7088: Code for Connect 4 Article * Renamed test --- .../algorithms/connect4/GameBoard.java | 129 ++++++++++++++++++ .../algorithms/connect4/GameUnitTest.java | 40 ++++++ .../baeldung/algorithms/connect4/Piece.java | 6 + 3 files changed, 175 insertions(+) create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameBoard.java create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameUnitTest.java create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/Piece.java diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameBoard.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameBoard.java new file mode 100644 index 0000000000..b10bd95a19 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameBoard.java @@ -0,0 +1,129 @@ +package com.baeldung.algorithms.connect4; + +import java.util.ArrayList; +import java.util.List; + +public class GameBoard { + private final List> columns; + + private final int rows; + + public GameBoard(int columns, int rows) { + this.rows = rows; + this.columns = new ArrayList<>(); + + for (int i = 0; i < columns; ++i) { + this.columns.add(new ArrayList<>()); + } + } + + public int getRows() { + return rows; + } + + public int getColumns() { + return columns.size(); + } + + public Piece getCell(int x, int y) { + assert(x >= 0 && x < getColumns()); + assert(y >= 0 && y < getRows()); + + List column = columns.get(x); + + if (column.size() > y) { + return column.get(y); + } else { + return null; + } + } + + public boolean move(int x, Piece player) { + assert(x >= 0 && x < getColumns()); + + List column = columns.get(x); + + if (column.size() >= this.rows) { + throw new IllegalArgumentException("That column is full"); + } + + column.add(player); + + return checkWin(x, column.size() - 1, player); + } + + private boolean checkWin(int x, int y, Piece player) { + // Vertical line + if (checkLine(x, y, 0, -1, player)) { + return true; + } + + for (int offset = 0; offset < 4; ++offset) { + // Horizontal line + if (checkLine(x - 3 + offset, y, 1, 0, player)) { + return true; + } + + // Leading diagonal + if (checkLine(x - 3 + offset, y + 3 - offset, 1, -1, player)) { + return true; + } + + // Trailing diagonal + if (checkLine(x - 3 + offset, y - 3 + offset, 1, 1, player)) { + return true; + } + } + + return false; + } + + private boolean checkLine(int x1, int y1, int xDiff, int yDiff, Piece player) { + for (int i = 0; i < 4; ++i) { + int x = x1 + (xDiff * i); + int y = y1 + (yDiff * i); + + if (x < 0 || x > columns.size() - 1) { + return false; + } + + if (y < 0 || y > rows - 1) { + return false; + } + + if (player != getCell(x, y)) { + return false; + } + } + + return true; + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + + for (int y = getRows() - 1; y >= 0; --y) { + for (int x = 0; x < getColumns(); ++x) { + Piece piece = getCell(x, y); + + result.append("|"); + if (piece == null) { + result.append(" "); + } else if (piece == Piece.PLAYER_1) { + result.append("X"); + } else if (piece == Piece.PLAYER_2) { + result.append("O"); + } + } + + result.append("|\n"); + for (int i = 0; i < getColumns(); ++i) { + result.append("+-"); + } + result.append("+\n"); + } + + return result.toString(); + } +} diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameUnitTest.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameUnitTest.java new file mode 100644 index 0000000000..f340644950 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/GameUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.algorithms.connect4; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class GameUnitTest { + @Test + public void blankGame() { + GameBoard gameBoard = new GameBoard(8, 6); + + System.out.println(gameBoard); + } + + @Test + public void playedGame() { + GameBoard gameBoard = new GameBoard(8, 6); + + assertFalse(gameBoard.move(3, Piece.PLAYER_1)); + assertFalse(gameBoard.move(2, Piece.PLAYER_2)); + + assertFalse(gameBoard.move(4, Piece.PLAYER_1)); + assertFalse(gameBoard.move(3, Piece.PLAYER_2)); + + assertFalse(gameBoard.move(5, Piece.PLAYER_1)); + assertFalse(gameBoard.move(6, Piece.PLAYER_2)); + + assertFalse(gameBoard.move(5, Piece.PLAYER_1)); + assertFalse(gameBoard.move(4, Piece.PLAYER_2)); + + assertFalse(gameBoard.move(5, Piece.PLAYER_1)); + assertFalse(gameBoard.move(5, Piece.PLAYER_2)); + + assertFalse(gameBoard.move(6, Piece.PLAYER_1)); + assertTrue(gameBoard.move(4, Piece.PLAYER_2)); + + System.out.println(gameBoard); + } +} diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/Piece.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/Piece.java new file mode 100644 index 0000000000..5a8724c09b --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/Piece.java @@ -0,0 +1,6 @@ +package com.baeldung.algorithms.connect4; + +public enum Piece { + PLAYER_1, + PLAYER_2 +} From 9d66171dd55ebbab41c74962f3a2dfad95edbe66 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Tue, 31 Oct 2023 20:19:54 +0000 Subject: [PATCH 306/831] change unit test name for apache commons unit test given one object and alt method --- .../ReturnFirstNonNullLazyEvaluateUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java index ae8ca09ea1..4064ec612c 100644 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -51,8 +51,8 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { } @Test - public void givenTwoObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { - Object object1 = methodA(); + public void givenNullableObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + Object object1 = null; Object object = ObjectUtils.getIfNull(object1, this::methodB); assertTrue(object != null); From 2f9acfe1d1a3e7eb69b628e6888095328de916fc Mon Sep 17 00:00:00 2001 From: Manfred <77407079+manfred106@users.noreply.github.com> Date: Tue, 31 Oct 2023 23:41:15 +0000 Subject: [PATCH 307/831] BAEL-7119: Localized Validation Messages in REST (#14996) * BAEL-7119: Localized Validation Messages in REST * BAEL-7119: Localized Validation Messages in REST - Remove unused imports --- spring-boot-modules/spring-boot-mvc/pom.xml | 4 + .../RestValidationApplication.java | 15 ++++ .../restvalidation/config/MessageConfig.java | 38 ++++++++++ ...rsiveLocaleContextMessageInterpolator.java | 36 +++++++++ .../response/InputFieldError.java | 12 +++ .../response/UpdateUserResponse.java | 17 +++++ .../restvalidation/service1/User.java | 15 ++++ .../restvalidation/service1/UserService1.java | 36 +++++++++ .../restvalidation/service2/User.java | 15 ++++ .../restvalidation/service2/UserService2.java | 40 ++++++++++ .../service3/FieldNotEmpty.java | 32 ++++++++ .../service3/FieldNotEmptyValidator.java | 16 ++++ .../restvalidation/service3/User.java | 13 ++++ .../restvalidation/service3/UserService3.java | 40 ++++++++++ .../CustomValidationMessages.properties | 3 + .../CustomValidationMessages_zh.properties | 3 + .../resources/ValidationMessages.properties | 1 + .../ValidationMessages_zh.properties | 1 + .../service1/UserService1IntegrationTest.java | 75 +++++++++++++++++++ .../service2/UserService2IntegrationTest.java | 75 +++++++++++++++++++ .../service3/UserService3IntegrationTest.java | 75 +++++++++++++++++++ 21 files changed, 562 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/RestValidationApplication.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/MessageConfig.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/RecursiveLocaleContextMessageInterpolator.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/InputFieldError.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/UpdateUserResponse.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/User.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/UserService1.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/User.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/UserService2.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmpty.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmptyValidator.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/User.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/UserService3.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages.properties create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages_zh.properties create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages.properties create mode 100644 spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages_zh.properties create mode 100644 spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service1/UserService1IntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service2/UserService2IntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service3/UserService3IntegrationTest.java diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml index 369bcf799b..a251c5049b 100644 --- a/spring-boot-modules/spring-boot-mvc/pom.xml +++ b/spring-boot-modules/spring-boot-mvc/pom.xml @@ -91,6 +91,10 @@ aspectjweaver ${aspectjweaver.version} + + org.projectlombok + lombok + diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/RestValidationApplication.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/RestValidationApplication.java new file mode 100644 index 0000000000..b335aecac2 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/RestValidationApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.restvalidation; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = { "com.baeldung.restvalidation" }) +public class RestValidationApplication { + + public static void main(String[] args) { + SpringApplication.run(RestValidationApplication.class, args); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/MessageConfig.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/MessageConfig.java new file mode 100644 index 0000000000..e37e2c9d78 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/MessageConfig.java @@ -0,0 +1,38 @@ +package com.baeldung.restvalidation.config; + +import javax.validation.MessageInterpolator; + +import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; +import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator; + +@Configuration +public class MessageConfig { + + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.setBasename("classpath:CustomValidationMessages"); + messageSource.setDefaultEncoding("UTF-8"); + return messageSource; + } + + @Bean + public MessageInterpolator getMessageInterpolator(MessageSource messageSource) { + MessageSourceResourceBundleLocator resourceBundleLocator = new MessageSourceResourceBundleLocator(messageSource); + ResourceBundleMessageInterpolator messageInterpolator = new ResourceBundleMessageInterpolator(resourceBundleLocator); + return new RecursiveLocaleContextMessageInterpolator(messageInterpolator); + } + + @Bean + public LocalValidatorFactoryBean getValidator(MessageInterpolator messageInterpolator) { + LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean(); + bean.setMessageInterpolator(messageInterpolator); + return bean; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/RecursiveLocaleContextMessageInterpolator.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/RecursiveLocaleContextMessageInterpolator.java new file mode 100644 index 0000000000..003a3d79b0 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/config/RecursiveLocaleContextMessageInterpolator.java @@ -0,0 +1,36 @@ +package com.baeldung.restvalidation.config; + +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.validation.MessageInterpolator; + +import org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator; +import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; + +public class RecursiveLocaleContextMessageInterpolator extends AbstractMessageInterpolator { + + private static final Pattern PATTERN_PLACEHOLDER = Pattern.compile("\\{([^}]+)\\}"); + + private final MessageInterpolator interpolator; + + public RecursiveLocaleContextMessageInterpolator(ResourceBundleMessageInterpolator interpolator) { + this.interpolator = interpolator; + } + + @Override + public String interpolate(MessageInterpolator.Context context, Locale locale, String message) { + int level = 0; + while (containsPlaceholder(message) && (level++ < 2)) { + message = this.interpolator.interpolate(message, context, locale); + } + return message; + } + + private boolean containsPlaceholder(String code) { + Matcher matcher = PATTERN_PLACEHOLDER.matcher(code); + return matcher.find(); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/InputFieldError.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/InputFieldError.java new file mode 100644 index 0000000000..06bd764d97 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/InputFieldError.java @@ -0,0 +1,12 @@ +package com.baeldung.restvalidation.response; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class InputFieldError { + private String field; + private String message; + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/UpdateUserResponse.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/UpdateUserResponse.java new file mode 100644 index 0000000000..7eb400cd2c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/response/UpdateUserResponse.java @@ -0,0 +1,17 @@ +package com.baeldung.restvalidation.response; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class UpdateUserResponse { + + private List fieldErrors; + +} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/User.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/User.java new file mode 100644 index 0000000000..f9a7d1a9b5 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/User.java @@ -0,0 +1,15 @@ +package com.baeldung.restvalidation.service1; + +import javax.validation.constraints.NotEmpty; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + + @NotEmpty + private String email; + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/UserService1.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/UserService1.java new file mode 100644 index 0000000000..790b5031e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service1/UserService1.java @@ -0,0 +1,36 @@ +package com.baeldung.restvalidation.service1; + +import org.springframework.http.*; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@RestController +public class UserService1 { + + @PutMapping(value = "/user1", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateUser(@RequestBody @Valid User user, + BindingResult bindingResult) { + if (bindingResult.hasFieldErrors()) { + + List fieldErrorList = bindingResult.getFieldErrors().stream() + .map(error -> new InputFieldError(error.getField(), error.getDefaultMessage())) + .collect(Collectors.toList()); + + UpdateUserResponse updateResponse = new UpdateUserResponse(fieldErrorList); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(updateResponse); + } + else { + // Update logic... + return ResponseEntity.status(HttpStatus.OK).build(); + } + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/User.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/User.java new file mode 100644 index 0000000000..a2e567766c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/User.java @@ -0,0 +1,15 @@ +package com.baeldung.restvalidation.service2; + +import javax.validation.constraints.NotEmpty; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + + @NotEmpty(message = "{validation.email.notEmpty}") + private String email; + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/UserService2.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/UserService2.java new file mode 100644 index 0000000000..4593a2b1bd --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service2/UserService2.java @@ -0,0 +1,40 @@ +package com.baeldung.restvalidation.service2; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@RestController +public class UserService2 { + + @PutMapping(value = "/user2", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateUser(@RequestBody @Valid User user, + BindingResult bindingResult) { + if (bindingResult.hasFieldErrors()) { + + List fieldErrorList = bindingResult.getFieldErrors().stream() + .map(error -> new InputFieldError(error.getField(), error.getDefaultMessage())) + .collect(Collectors.toList()); + + UpdateUserResponse updateResponse = new UpdateUserResponse(fieldErrorList); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(updateResponse); + } + else { + // Update logic... + return ResponseEntity.status(HttpStatus.OK).build(); + } + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmpty.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmpty.java new file mode 100644 index 0000000000..93c7052d5b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmpty.java @@ -0,0 +1,32 @@ +package com.baeldung.restvalidation.service3; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Documented +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +@Constraint(validatedBy = { FieldNotEmptyValidator.class }) +public @interface FieldNotEmpty { + + String message() default "{validation.notEmpty}"; + + String field() default "Field"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmptyValidator.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmptyValidator.java new file mode 100644 index 0000000000..356efc590b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/FieldNotEmptyValidator.java @@ -0,0 +1,16 @@ +package com.baeldung.restvalidation.service3; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class FieldNotEmptyValidator implements ConstraintValidator { + + private String message; + private String field; + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + return (value != null && !value.toString().trim().isEmpty()); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/User.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/User.java new file mode 100644 index 0000000000..97b38feba4 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/User.java @@ -0,0 +1,13 @@ +package com.baeldung.restvalidation.service3; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + + @FieldNotEmpty(message = "{validation.notEmpty}", field = "{field.personalEmail}") + private String email; + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/UserService3.java b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/UserService3.java new file mode 100644 index 0000000000..e506b63d8e --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/restvalidation/service3/UserService3.java @@ -0,0 +1,40 @@ +package com.baeldung.restvalidation.service3; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.validation.Valid; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@RestController +public class UserService3 { + + @PutMapping(value = "/user3", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity updateUser(@RequestBody @Valid User user, + BindingResult bindingResult) { + if (bindingResult.hasFieldErrors()) { + + List fieldErrorList = bindingResult.getFieldErrors().stream() + .map(error -> new InputFieldError(error.getField(), error.getDefaultMessage())) + .collect(Collectors.toList()); + + UpdateUserResponse updateResponse = new UpdateUserResponse(fieldErrorList); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(updateResponse); + } + else { + // Update logic... + return ResponseEntity.status(HttpStatus.OK).build(); + } + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages.properties b/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages.properties new file mode 100644 index 0000000000..58cabc30c9 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages.properties @@ -0,0 +1,3 @@ +field.personalEmail=Personal Email +validation.notEmpty={field} cannot be empty +validation.email.notEmpty=Email cannot be empty \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages_zh.properties b/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages_zh.properties new file mode 100644 index 0000000000..b4fbe909bb --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/resources/CustomValidationMessages_zh.properties @@ -0,0 +1,3 @@ +field.personalEmail=個人電郵 +validation.notEmpty={field}不能是空白 +validation.email.notEmpty=電郵不能留空 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages.properties b/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages.properties new file mode 100644 index 0000000000..90d3c88a8f --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages.properties @@ -0,0 +1 @@ +javax.validation.constraints.NotEmpty.message=The field cannot be empty \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages_zh.properties b/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages_zh.properties new file mode 100644 index 0000000000..04f415911c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/main/resources/ValidationMessages_zh.properties @@ -0,0 +1 @@ +javax.validation.constraints.NotEmpty.message=本欄不能留空 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service1/UserService1IntegrationTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service1/UserService1IntegrationTest.java new file mode 100644 index 0000000000..969a6c17a6 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service1/UserService1IntegrationTest.java @@ -0,0 +1,75 @@ +package com.baeldung.restvalidation.service1; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Objects; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.restvalidation.RestValidationApplication; +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RestValidationApplication.class) +class UserService1IntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + void whenUpdateValidEmail_thenReturnsOK() { + + // When + ResponseEntity responseEntity = updateUser(new User("test@email.com"), null); + + // Then + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + void whenUpdateEmptyEmail_thenReturnsErrorMessageInEnglish() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), null); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("The field cannot be empty", error.getMessage()); + } + + @Test + void whenUpdateEmptyEmailWithLanguageHeaderEqualsToZh_thenReturnsErrorMessageInChinese() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), "zh-tw"); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("本欄不能留空", error.getMessage()); + } + + private ResponseEntity updateUser(User user, String language) { + + HttpHeaders headers = new HttpHeaders(); + if (Objects.nonNull(language)) { + headers.set(HttpHeaders.ACCEPT_LANGUAGE, language); + } + + return restTemplate.exchange( + "/user1", + HttpMethod.PUT, + new HttpEntity<>(user, headers), + UpdateUserResponse.class + ); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service2/UserService2IntegrationTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service2/UserService2IntegrationTest.java new file mode 100644 index 0000000000..3e92229d7b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service2/UserService2IntegrationTest.java @@ -0,0 +1,75 @@ +package com.baeldung.restvalidation.service2; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Objects; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.restvalidation.RestValidationApplication; +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RestValidationApplication.class) +class UserService2IntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + void whenUpdateValidEmail_thenReturnsOK() { + + // When + ResponseEntity responseEntity = updateUser(new User("test@email.com"), null); + + // Then + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + void whenUpdateEmptyEmail_thenReturnsErrorMessageInEnglish() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), null); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("Email cannot be empty", error.getMessage()); + } + + @Test + void whenUpdateEmptyEmailWithLanguageHeaderEqualsToZh_thenReturnsErrorMessageInChinese() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), "zh-tw"); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("電郵不能留空", error.getMessage()); + } + + private ResponseEntity updateUser(User user, String language) { + + HttpHeaders headers = new HttpHeaders(); + if (Objects.nonNull(language)) { + headers.set(HttpHeaders.ACCEPT_LANGUAGE, language); + } + + return restTemplate.exchange( + "/user2", + HttpMethod.PUT, + new HttpEntity<>(user, headers), + UpdateUserResponse.class + ); + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service3/UserService3IntegrationTest.java b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service3/UserService3IntegrationTest.java new file mode 100644 index 0000000000..8bc4d460ea --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/restvalidation/service3/UserService3IntegrationTest.java @@ -0,0 +1,75 @@ +package com.baeldung.restvalidation.service3; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Objects; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.restvalidation.RestValidationApplication; +import com.baeldung.restvalidation.response.InputFieldError; +import com.baeldung.restvalidation.response.UpdateUserResponse; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RestValidationApplication.class) +class UserService3IntegrationTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + void whenUpdateValidEmail_thenReturnsOK() { + + // When + ResponseEntity responseEntity = updateUser(new User("test@email.com"), null); + + // Then + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + void whenUpdateEmptyEmail_thenReturnsErrorMessageInEnglish() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), null); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("Personal Email cannot be empty", error.getMessage()); + } + + @Test + void whenUpdateEmptyEmailWithLanguageHeaderEqualsToZh_thenReturnsErrorMessageInChinese() { + + // When + ResponseEntity responseEntity = updateUser(new User(""), "zh-tw"); + + // Then + InputFieldError error = responseEntity.getBody().getFieldErrors().get(0); + assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); + assertEquals("個人電郵不能是空白", error.getMessage()); + } + + private ResponseEntity updateUser(User user, String language) { + + HttpHeaders headers = new HttpHeaders(); + if (Objects.nonNull(language)) { + headers.set(HttpHeaders.ACCEPT_LANGUAGE, language); + } + + return restTemplate.exchange( + "/user3", + HttpMethod.PUT, + new HttpEntity<>(user, headers), + UpdateUserResponse.class + ); + } + +} \ No newline at end of file From feca50daca29d74b161e7ccb6fff6bde710f01e6 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Tue, 31 Oct 2023 20:17:39 -0400 Subject: [PATCH 308/831] Incorporated review comments --- .../baeldung/kafka/message/ordering/Config.java | 3 +++ .../ordering/ExtSeqWithTimeWindowConsumer.java | 6 +++--- .../ordering/ExtSeqWithTimeWindowProducer.java | 12 ++++++++---- .../message/ordering/MultiPartitionConsumer.java | 9 +++++---- .../message/ordering/MultiPartitionProducer.java | 14 +++++++++----- .../message/ordering/ProducerConfigurations.java | 2 +- .../message/ordering/SinglePartitionConsumer.java | 6 +++--- .../message/ordering/SinglePartitionProducer.java | 14 +++++++++----- 8 files changed, 41 insertions(+), 25 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java index 2635e72431..12acfecf51 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java @@ -2,4 +2,7 @@ package com.baeldung.kafka.message.ordering; public class Config { public static final String CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS = "value.deserializer.serializedClass"; + public static final String KAFKA_LOCAL = "localhost:9092"; + public static final String MULTI_PARTITION_TOPIC = "multi_partition_topic"; + public static final String SINGLE_PARTITION_TOPIC = "single_partition_topic"; } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java index 639a980462..06cb7104b7 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java @@ -17,14 +17,14 @@ public class ExtSeqWithTimeWindowConsumer { public static void main(String[] args) { Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList("multi_partition_topic")); + consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); while (true) { @@ -42,7 +42,7 @@ public class ExtSeqWithTimeWindowConsumer { private static void processBuffer(List buffer) { Collections.sort(buffer); buffer.forEach(userEvent -> { - System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", event nano time : " + userEvent.getEventNanoTime()); + System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", User Event Id: " + userEvent.getUserEventId()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java index c18e35b351..73a62c0bf2 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java @@ -5,15 +5,18 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class ExtSeqWithTimeWindowProducer { - public static void main(String[] args) { + public static void main(String[] args) throws ExecutionException, InterruptedException { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); @@ -21,8 +24,9 @@ public class ExtSeqWithTimeWindowProducer { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); userEvent.setGlobalSequenceNumber(sequenceNumber); - producer.send(new ProducerRecord<>("multi_partition_topic", sequenceNumber, userEvent)); - System.out.println("User Event Nano time : " + userEvent.getEventNanoTime() + ", User Event Id: " + userEvent.getUserEventId()); + Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); + RecordMetadata metadata = future.get(); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } producer.close(); System.out.println("ExternalSequencingProducer Completed."); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java index e738832425..82f05cc80e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java @@ -14,22 +14,23 @@ import java.util.Properties; public class MultiPartitionConsumer { private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); + public static void main(String[] args) { Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList("multi_partition_topic")); + consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); while (true) { ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { UserEvent userEvent = record.value(); if (userEvent != null) { - System.out.println("Process message with event nano time : " + userEvent.getEventNanoTime() + ", Event ID: " + userEvent.getUserEventId()); + System.out.println("User Event ID: " + userEvent.getUserEventId()); } }); } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java index db02c87bbe..52da49ab80 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java @@ -5,25 +5,29 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.serialization.LongSerializer; import java.util.Properties; import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class MultiPartitionProducer { - public static void main(String[] args) { + public static void main(String[] args) throws ExecutionException, InterruptedException { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); for (long count = 1; count <= 10 ; count++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); - producer.send(new ProducerRecord<>("multi_partition_topic", count, userEvent)); - System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); + Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, count, userEvent)); + RecordMetadata metadata = future.get(); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } producer.close(); - System.out.println("SinglePartitionProducer Completed."); + System.out.println("MultiPartitionProducer Completed."); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 0eb563910e..61c9cb48aa 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -10,7 +10,7 @@ import java.util.Properties; public class ProducerConfigurations { public static void main(String[] args) { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java index 5f5ce86924..1c50f3cf7a 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java @@ -17,19 +17,19 @@ public class SinglePartitionConsumer { public static void main(String[] args) { Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList("single_partition_topic")); + consumer.subscribe(Collections.singletonList(Config.SINGLE_PARTITION_TOPIC)); while (true) { ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { UserEvent userEvent = record.value(); - System.out.println("Process message with event nano time : " + userEvent.getEventNanoTime() + ", Event ID: " + userEvent.getUserEventId()); + System.out.println("User Event ID: " + userEvent.getUserEventId()); }); } } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java index 2a7719e34f..9306abaebf 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java @@ -5,24 +5,28 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; import org.apache.kafka.common.serialization.LongSerializer; import java.time.Instant; import java.util.Properties; import java.util.UUID; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class SinglePartitionProducer { - public static void main(String[] args) { + public static void main(String[] args) throws ExecutionException, InterruptedException { Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); KafkaProducer producer = new KafkaProducer<>(props); - for (long count = 1; count <= 10 ; count++) { + for (long count = 1; count <= 10; count++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); - producer.send(new ProducerRecord<>("single_partition_topic", count, userEvent)); - System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); + Future future = producer.send(new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, count, userEvent)); + RecordMetadata metadata = future.get(); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } producer.close(); System.out.println("SinglePartitionProducer Completed."); From 88f85963bb1614a10025cadb123ab5b26bc2b489 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Tue, 31 Oct 2023 22:04:32 -0400 Subject: [PATCH 309/831] Config changes --- .../kafka/message/ordering/ConsumerConfigurations.java | 4 ++-- .../kafka/message/ordering/ProducerConfigurations.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java index 15562cfcef..5b5a1f8e0b 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java @@ -16,7 +16,7 @@ import java.util.Properties; public class ConsumerConfigurations { public static void main(String[] args) { Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); @@ -24,7 +24,7 @@ public class ConsumerConfigurations { props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1"); props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList("multi_partition_topic")); + consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); while (true) { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java index 61c9cb48aa..79fc42be3d 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java @@ -16,14 +16,15 @@ public class ProducerConfigurations { props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); + props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true"); KafkaProducer producer = new KafkaProducer<>(props); for (int i = 0; i < 10; i++) { - String key = "Key-" + (i % 3); // Assuming 3 partitions - producer.send(new ProducerRecord<>("multi_partition_topic", key, "Message-" + i)); + String key = "Key-" + (i % 5); // Assuming 5 partitions + producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, key, "Message-" + i)); } producer.close(); - System.out.println("MultiPartitionProducer Completed."); + System.out.println("Producer Configurations Completed."); } } From 016579337010ab145058a3b25dc8b437f8c6f1b6 Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Wed, 1 Nov 2023 10:36:43 +0700 Subject: [PATCH 310/831] Update core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java IntStream to loop Co-authored-by: Liam Williams --- .../uuid/UUIDLongGeneratorUnitTest.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java index 24add0a14a..6d2dff959c 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java @@ -37,20 +37,16 @@ public class UUIDLongGeneratorUnitTest { private void collisionAndNegativeCheck(Method method) { Set uniqueValues = new HashSet<>(); - AtomicInteger collisions = new AtomicInteger(0); - AtomicInteger negative = new AtomicInteger(0); + int collisions = 0; + int negative = 0; - IntStream.range(0, n).forEach(i -> { - try { - long uniqueValue = (long) method.invoke(uuidLongGenerator); - if (!uniqueValues.add(uniqueValue)) { - collisions.incrementAndGet(); - } - if (uniqueValue < 0) { - negative.incrementAndGet(); - } - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); + for (int i = 0; i < n; i++) { + long uniqueValue = (long) method.invoke(uuidLongGenerator); + if (!uniqueValues.add(uniqueValue)) { + collisions++; + } + if (uniqueValue < 0) { + negative++; } }); From b55db89b5fb10e1fb4d678505f86fe54a82b355c Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 10:37:14 +0700 Subject: [PATCH 311/831] update --- ...or.java => UUIDPositiveLongGenerator.java} | 22 ++++--- .../uuid/UUIDLongGeneratorUnitTest.java | 63 ------------------- .../UUIDPositiveLongGeneratorUnitTest.java | 60 ++++++++++++++++++ 3 files changed, 73 insertions(+), 72 deletions(-) rename core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/{UUIDLongGenerator.java => UUIDPositiveLongGenerator.java} (68%) delete mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java similarity index 68% rename from core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java rename to core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index 8ac71b1ce6..bc8177837c 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -3,17 +3,21 @@ package com.baeldung.uuid; import java.nio.ByteBuffer; import java.util.UUID; -public class UUIDLongGenerator { +/** + * Methods are called by reflection in the unit test + */ +@SuppressWarnings("unused") +public class UUIDPositiveLongGenerator { public long getLeastSignificantBits(){ - return UUID.randomUUID().getLeastSignificantBits(); + return Math.abs(UUID.randomUUID().getLeastSignificantBits()); } public long getMostSignificantBits(){ - return UUID.randomUUID().getMostSignificantBits(); + return Math.abs(UUID.randomUUID().getMostSignificantBits()); } public long gethashCode(){ - return UUID.randomUUID().toString().hashCode(); + return Math.abs(UUID.randomUUID().toString().hashCode()); } public long combineByteBuffer(){ @@ -21,21 +25,21 @@ public class UUIDLongGenerator { ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); - bb.rewind(); // Kembalikan posisi buffer ke awal - return bb.getLong(); + bb.rewind(); + return Math.abs(bb.getLong()); } public long combineBitwise(){ UUID uniqueUUID; uniqueUUID = UUID.randomUUID(); - return (uniqueUUID.getMostSignificantBits() << 32) | (uniqueUUID.getLeastSignificantBits() & 0xFFFFFFFFL); + return Math.abs((uniqueUUID.getMostSignificantBits() << 32) | (uniqueUUID.getLeastSignificantBits() & 0xFFFFFFFFL)); } public long combineDirect(){ UUID uniqueUUID = UUID.randomUUID(); long mostSignificantBits = uniqueUUID.getMostSignificantBits(); long leastSignificantBits = uniqueUUID.getLeastSignificantBits(); - return mostSignificantBits ^ (leastSignificantBits >> 1); + return Math.abs(mostSignificantBits ^ (leastSignificantBits >> 1)); } public long combinePermutation(){ @@ -53,6 +57,6 @@ public class UUIDLongGenerator { for (byte b : uuidBytes) { result = (result << 8) | (b & 0xFF); } - return result; + return Math.abs(result); } } diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java deleted file mode 100644 index 24add0a14a..0000000000 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.baeldung.uuid; - -import org.junit.jupiter.api.Test; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.text.DecimalFormat; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.IntStream; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class UUIDLongGeneratorUnitTest { - final static int n = 1000000; - UUIDLongGenerator uuidLongGenerator = new UUIDLongGenerator(); - - @Test - void whenForeachGenerateLongValue_thenCollisionsCheck() { - printTableHeader(); - for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { - collisionAndNegativeCheck(method); - } - } - - private void printTableHeader() { - System.out.format("%-30s %-15s %-15s %-15s %-15s%n", "Approach", "collisions", "negatives", "collision", "negative"); - System.out.format("%-30s %-15s %-15s %-15s %-15s%n", "(method name)", "count", "count", "probability", "probability"); - System.out.println("--------------------------------------------------------------------------------------------"); - } - - private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { - DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - System.out.format("%-30s %-15s %-15s %-15s %-15s%n", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability)); - } - - private void collisionAndNegativeCheck(Method method) { - Set uniqueValues = new HashSet<>(); - AtomicInteger collisions = new AtomicInteger(0); - AtomicInteger negative = new AtomicInteger(0); - - IntStream.range(0, n).forEach(i -> { - try { - long uniqueValue = (long) method.invoke(uuidLongGenerator); - if (!uniqueValues.add(uniqueValue)) { - collisions.incrementAndGet(); - } - if (uniqueValue < 0) { - negative.incrementAndGet(); - } - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - }); - - double collisionsProbability = (double) collisions.get() / n; - double negativeProbability = (double) negative.get() / n; - printOutput(method.getName(), collisions.get(), negative.get(), collisionsProbability, negativeProbability); - - assertTrue(collisionsProbability <= 0.001); // threshold = 0.001 - } -} diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java new file mode 100644 index 0000000000..2df49b20fd --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.uuid; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.text.DecimalFormat; +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +public class UUIDPositiveLongGeneratorUnitTest { + private final static int n = 1000000; + private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); + private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); + + @Test + void whenForeachGenerateLongValue_thenCollisionsCheck() throws InvocationTargetException, IllegalAccessException { + printTableHeader(); + for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { + collisionAndNegativeCheck(method); + } + } + + + private void printTableHeader() { + logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", "Approach", "collisions", "negatives", "collision", "negative")); + logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", "(method name)", "count", "count", "probability", "probability")); + logger.info("--------------------------------------------------------------------------------------------"); + } + + private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { + DecimalFormat decimalFormat = new DecimalFormat("#.#####"); + //logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability))); + logger.info("%-30s{} %-15s{} %-15s{} %-15s{} %-15s{}", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability)); + } + + + private void collisionAndNegativeCheck(Method method) throws InvocationTargetException, IllegalAccessException { + Set uniqueValues = new HashSet<>(); + int collisions = 0; + int negative = 0; + for (int i = 0; i < n; i++) { + long uniqueValue = (long) method.invoke(uuidLongGenerator); + if (!uniqueValues.add(uniqueValue)) { + collisions++; + } + if (uniqueValue < 0) { + negative++; + } + } + double collisionsProbability = (double) collisions / n; + double negativeProbability = (double) negative / n; + printOutput(method.getName(), collisions, negative, collisionsProbability, negativeProbability); + assertThat(collisionsProbability).isLessThan(0.001); + } +} From 579f35981e6910a3b9957f6a95300edcd5ce7015 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 11:01:27 +0700 Subject: [PATCH 312/831] update, rename class --- .../uuid/UUIDLongGeneratorUnitTest.java | 60 ------------------- .../UUIDPositiveLongGeneratorUnitTest.java | 6 +- 2 files changed, 3 insertions(+), 63 deletions(-) delete mode 100644 core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java deleted file mode 100644 index fde726d259..0000000000 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDLongGeneratorUnitTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.uuid; - -import org.apache.log4j.Logger; -import org.junit.jupiter.api.Test; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.text.DecimalFormat; -import java.util.HashSet; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UUIDLongGeneratorUnitTest { - private final static int n = 1000000; - private final static double COLLISION_THRESHOLD = 0.001; - private static final Logger logger = Logger.getLogger(UUIDLongGeneratorUnitTest.class); - private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); - - @Test - void whenForeachGenerateLongValue_thenCollisionsCheck() throws InvocationTargetException, IllegalAccessException { - printTableHeader(); - for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { - collisionAndNegativeCheck(method); - } - } - - private void printTableHeader() { - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s%n", "Approach", "collisions", "negatives", "collision", "negative")); - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s%n", "(method name)", "count", "count", "probability", "probability")); - System.out.println("--------------------------------------------------------------------------------------------"); - } - - private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { - DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability))); - } - - private void collisionAndNegativeCheck(Method method) throws InvocationTargetException, IllegalAccessException { - Set uniqueValues = new HashSet<>(); - int collisions = 0; - int negative = 0; - - for (int i = 0; i < n; i++) { - long uniqueValue = (long) method.invoke(uuidLongGenerator); - if (!uniqueValues.add(uniqueValue)) { - collisions++; - } - if (uniqueValue < 0) { - negative++; - } - } - - double collisionsProbability = (double) collisions / n; - double negativeProbability = (double) negative / n; - printOutput(method.getName(), collisions, negative, collisionsProbability, negativeProbability); - - assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); - } -} diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 2df49b20fd..c910a6eb16 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -14,6 +14,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class UUIDPositiveLongGeneratorUnitTest { private final static int n = 1000000; + private final static double COLLISION_THRESHOLD = 0.001; private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); @@ -34,8 +35,7 @@ public class UUIDPositiveLongGeneratorUnitTest { private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - //logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability))); - logger.info("%-30s{} %-15s{} %-15s{} %-15s{} %-15s{}", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability)); + logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability))); } @@ -55,6 +55,6 @@ public class UUIDPositiveLongGeneratorUnitTest { double collisionsProbability = (double) collisions / n; double negativeProbability = (double) negative / n; printOutput(method.getName(), collisions, negative, collisionsProbability, negativeProbability); - assertThat(collisionsProbability).isLessThan(0.001); + assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); } } From 10ddc978542620d06d1ab34cf0ce71e6c5b56210 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 12:44:04 +0700 Subject: [PATCH 313/831] update --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index c910a6eb16..5847ef44fb 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -22,7 +22,7 @@ public class UUIDPositiveLongGeneratorUnitTest { void whenForeachGenerateLongValue_thenCollisionsCheck() throws InvocationTargetException, IllegalAccessException { printTableHeader(); for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { - collisionAndNegativeCheck(method); + collisionCheck(method); } } @@ -39,7 +39,7 @@ public class UUIDPositiveLongGeneratorUnitTest { } - private void collisionAndNegativeCheck(Method method) throws InvocationTargetException, IllegalAccessException { + private void collisionCheck(Method method) throws InvocationTargetException, IllegalAccessException { Set uniqueValues = new HashSet<>(); int collisions = 0; int negative = 0; From e0ca0be76af2e7b8a96a5d4e1c5165b1a0967b9d Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 16:27:09 +0700 Subject: [PATCH 314/831] positive --- .../uuid/UUIDPositiveLongGeneratorUnitTest.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 5847ef44fb..cd538af523 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -28,33 +28,27 @@ public class UUIDPositiveLongGeneratorUnitTest { private void printTableHeader() { - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", "Approach", "collisions", "negatives", "collision", "negative")); - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", "(method name)", "count", "count", "probability", "probability")); - logger.info("--------------------------------------------------------------------------------------------"); + logger.info(String.format("%-30s %-15s %-15s", "Approach(method name)", "collisions", "probability")); + logger.info("-----------------------------------------------------------------------"); } - private void printOutput(String method, int collisionsCount, int negativeCount, double collisionsProbability, double negativeProbability) { + private void printOutput(String method, int collisionsCount, double collisionsProbability) { DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - logger.info(String.format("%-30s %-15s %-15s %-15s %-15s", method, collisionsCount, negativeCount, decimalFormat.format(collisionsProbability), decimalFormat.format(negativeProbability))); + logger.info(String.format("%-30s %-15s %-15s", method, collisionsCount, decimalFormat.format(collisionsProbability))); } private void collisionCheck(Method method) throws InvocationTargetException, IllegalAccessException { Set uniqueValues = new HashSet<>(); int collisions = 0; - int negative = 0; for (int i = 0; i < n; i++) { long uniqueValue = (long) method.invoke(uuidLongGenerator); if (!uniqueValues.add(uniqueValue)) { collisions++; } - if (uniqueValue < 0) { - negative++; - } } double collisionsProbability = (double) collisions / n; - double negativeProbability = (double) negative / n; - printOutput(method.getName(), collisions, negative, collisionsProbability, negativeProbability); + printOutput(method.getName(), collisions, collisionsProbability); assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); } } From b696d205f616f3a067baa451ea4dd9e846cd01f9 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:00:50 +0200 Subject: [PATCH 315/831] [JAVA-26243] Upgraded spring-di-3 module to spring-boot 3 (#14997) --- spring-di-2/pom.xml | 12 +++------- .../com/baeldung/di/aspectj/PersonEntity.java | 6 ++--- .../FieldByNameInjectIntegrationTest.java | 4 ++-- .../inject/FieldInjectIntegrationTest.java | 2 +- .../FieldQualifierInjectIntegrationTest.java | 2 +- ...FieldResourceInjectionIntegrationTest.java | 2 +- ...hodByQualifierResourceIntegrationTest.java | 2 +- .../MethodByTypeResourceIntegrationTest.java | 2 +- ...ethodResourceInjectionIntegrationTest.java | 2 +- .../NamedResourceIntegrationTest.java | 2 +- ...ifierResourceInjectionIntegrationTest.java | 2 +- ...etterResourceInjectionIntegrationTest.java | 2 +- spring-di-3/pom.xml | 8 ++++--- .../DynamicAutowireIntegrationTest.java | 2 +- spring-di-4/pom.xml | 4 ++-- .../baeldung/sampleabstract/BallService.java | 2 +- spring-di/pom.xml | 22 ++++--------------- 17 files changed, 30 insertions(+), 48 deletions(-) diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index 69333c74f1..0bd6c41a8c 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-spring-5 + parent-spring-6 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-6 @@ -46,11 +46,6 @@ org.springframework spring-aspects - - javax.inject - javax.inject - ${javax.inject.version} - org.springframework.boot spring-boot-starter-test @@ -84,9 +79,8 @@ - 2.6.1 + 3.1.2 1.14.0 - 1 2.17.1 diff --git a/spring-di-2/src/main/java/com/baeldung/di/aspectj/PersonEntity.java b/spring-di-2/src/main/java/com/baeldung/di/aspectj/PersonEntity.java index f087a97c7e..758a942227 100644 --- a/spring-di-2/src/main/java/com/baeldung/di/aspectj/PersonEntity.java +++ b/spring-di-2/src/main/java/com/baeldung/di/aspectj/PersonEntity.java @@ -3,9 +3,9 @@ package com.baeldung.di.aspectj; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Transient; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Transient; @Entity @Configurable(preConstruction = true) diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java index d1a75d73ea..f7ca089355 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java @@ -3,8 +3,8 @@ package com.baeldung.wiring.configuration.inject; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java index 995f560701..c06205aee8 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java @@ -3,7 +3,7 @@ package com.baeldung.wiring.configuration.inject; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java index 67fa2bf3d4..2a3e41f63f 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java @@ -3,7 +3,7 @@ package com.baeldung.wiring.configuration.inject; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java index 938d557939..16430a0573 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java @@ -5,7 +5,7 @@ import static org.junit.Assert.assertNotNull; import java.io.File; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java index f49bf70aba..1c1e3388b5 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java @@ -9,7 +9,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceQualifier; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java index aecd02a1d5..660610753f 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java index 4ef9368c28..0fcc2b1c50 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java index 4339194f63..5aed1ac7cb 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java index cc8c669757..03f82adef3 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java @@ -9,7 +9,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceQualifier; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java index 90c8677bff..605f86172c 100644 --- a/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java +++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.io.File; import static org.junit.Assert.assertEquals; diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml index 2d635d1f85..ba1a18ae8c 100644 --- a/spring-di-3/pom.xml +++ b/spring-di-3/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-spring-5 + parent-spring-6 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-6 @@ -45,8 +45,10 @@ - 2.6.1 + 3.1.2 2.17.1 + 2.0.9 + 1.4.11 \ No newline at end of file diff --git a/spring-di-3/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java b/spring-di-3/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java index 56582ecb66..d93f94b0e3 100644 --- a/spring-di-3/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java +++ b/spring-di-3/src/test/java/com/baeldung/dynamic/autowire/DynamicAutowireIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = DynamicAutowireConfig.class) diff --git a/spring-di-4/pom.xml b/spring-di-4/pom.xml index c6572495cb..1eec8efcf0 100644 --- a/spring-di-4/pom.xml +++ b/spring-di-4/pom.xml @@ -9,9 +9,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 diff --git a/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java index 0d951aac8b..541d8dfb6b 100644 --- a/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java +++ b/spring-di-4/src/main/java/com/baeldung/sampleabstract/BallService.java @@ -2,7 +2,7 @@ package com.baeldung.sampleabstract; import org.springframework.beans.factory.annotation.Autowired; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; public abstract class BallService { diff --git a/spring-di/pom.xml b/spring-di/pom.xml index af0601deb6..bae7263ef9 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-spring-5 + parent-spring-6 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-spring-6 @@ -48,11 +48,6 @@ spring-context ${spring.version} - - javax.inject - javax.inject - ${javax.inject.version} - com.google.guava guava @@ -71,7 +66,7 @@ org.springframework.boot spring-boot-test - ${mockito.spring.boot.version} + ${spring-boot.version} test @@ -89,11 +84,6 @@ - - javax.annotation - javax.annotation-api - ${annotation-api.version} - @@ -143,11 +133,7 @@ org.baeldung.org.baeldung.sample.App - 1.3.2 - 1.4.4.RELEASE - 1 - 1.5.2.RELEASE - 1.10.19 + 3.1.2 1.9.5 From 3286aab10c4b7a438e5b24c0a80bd368d7ad89e5 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 18:24:02 +0700 Subject: [PATCH 316/831] bit 16 to 64 --- .../main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index bc8177837c..bb3e0223f3 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -22,7 +22,7 @@ public class UUIDPositiveLongGenerator { public long combineByteBuffer(){ UUID uuid = UUID.randomUUID(); - ByteBuffer bb = ByteBuffer.wrap(new byte[16]); + ByteBuffer bb = ByteBuffer.wrap(new byte[64]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); bb.rewind(); From 039753af1fc5b661ba0a15524814d9b650988264 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Wed, 1 Nov 2023 18:26:54 +0700 Subject: [PATCH 317/831] back to 16 --- .../main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index bb3e0223f3..bc8177837c 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -22,7 +22,7 @@ public class UUIDPositiveLongGenerator { public long combineByteBuffer(){ UUID uuid = UUID.randomUUID(); - ByteBuffer bb = ByteBuffer.wrap(new byte[64]); + ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); bb.rewind(); From 33f52b2e0bf44f70b1ecb114911a214925e9590a Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:54:40 +0200 Subject: [PATCH 318/831] This PR is related to the article BAEL-7130 (#15109) * This commit related to the article BAEL-7130 This commit aims to add a RoundDate class with several methods to round the date. * This commit related to the article BAEL-7130 This commit aims to add a test class DateRoundingUnitTest. --- .../com/baeldung/rounddate/RoundDate.java | 113 ++++++++++++++++++ .../rounddate/DateRoundingUnitTest.java | 63 ++++++++++ 2 files changed, 176 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/rounddate/RoundDate.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/rounddate/DateRoundingUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/rounddate/RoundDate.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/rounddate/RoundDate.java new file mode 100644 index 0000000000..6fb7cf87b7 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/rounddate/RoundDate.java @@ -0,0 +1,113 @@ +package com.baeldung.rounddate; + +import java.time.DayOfWeek; +import java.time.temporal.ChronoField; +import java.time.temporal.TemporalAdjusters; +import java.util.Calendar; +import java.util.Date; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; + +public class RoundDate { + public static Date getDate(int year, int month, int day, int hour, int minute) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DAY_OF_MONTH, day); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + return calendar.getTime(); + } + + public static Date roundToDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + public static Date roundToNearestUnit(Date date, int unit) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + switch (unit) { + case Calendar.HOUR: + int minute = calendar.get(Calendar.MINUTE); + if (minute >= 0 && minute < 15) { + calendar.set(Calendar.MINUTE, 0); + } else if (minute >= 15 && minute < 45) { + calendar.set(Calendar.MINUTE, 30); + } else { + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.HOUR_OF_DAY, 1); + } + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + break; + + case Calendar.DAY_OF_MONTH: + int hour = calendar.get(Calendar.HOUR_OF_DAY); + if (hour >= 12) { + calendar.add(Calendar.DAY_OF_MONTH, 1); + } + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + break; + + case Calendar.MONTH: + int day = calendar.get(Calendar.DAY_OF_MONTH); + if (day >= 15) { + calendar.add(Calendar.MONTH, 1); + } + calendar.set(Calendar.DAY_OF_MONTH, 1); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + break; + } + + return calendar.getTime(); + } + + public static LocalDateTime roundToStartOfMonthUsingLocalDateTime(LocalDateTime dateTime) { + return dateTime.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0); + } + + public static LocalDateTime roundToEndOfWeekUsingLocalDateTime(LocalDateTime dateTime) { + return dateTime.with(TemporalAdjusters.next(DayOfWeek.SATURDAY)) + .withHour(23) + .withMinute(59) + .withSecond(59) + .withNano(999); + } + + public static ZonedDateTime roundToStartOfMonthUsingZonedDateTime(ZonedDateTime dateTime) { + return dateTime.withDayOfMonth(1) + .withHour(0) + .withMinute(0) + .withSecond(0) + .with(ChronoField.MILLI_OF_SECOND, 0) + .with(ChronoField.MICRO_OF_SECOND, 0) + .with(ChronoField.NANO_OF_SECOND, 0); + } + + public static ZonedDateTime roundToEndOfWeekUsingZonedDateTime(ZonedDateTime dateTime) { + return dateTime.with(TemporalAdjusters.next(DayOfWeek.SATURDAY)) + .withHour(23) + .withMinute(59) + .withSecond(59) + .with(ChronoField.MILLI_OF_SECOND, 999) + .with(ChronoField.MICRO_OF_SECOND, 999) + .with(ChronoField.NANO_OF_SECOND, 999); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/rounddate/DateRoundingUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/rounddate/DateRoundingUnitTest.java new file mode 100644 index 0000000000..bbe49d8340 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/rounddate/DateRoundingUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.rounddate; + +import org.junit.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Calendar; +import java.util.Date; + +import static org.junit.Assert.assertEquals; + +public class DateRoundingUnitTest { + + @Test + public void givenDate_whenRoundToDay_thenBeginningOfDay() { + Date date = RoundDate.getDate(2023, Calendar.JANUARY, 27, 14, 30); + Date result = RoundDate.roundToDay(date); + assertEquals(RoundDate.getDate(2023, Calendar.JANUARY, 27, 0, 0), result); + } + + @Test + public void givenDate_whenRoundToNearestUnit_thenNearestUnit() { + Date date = RoundDate.getDate(2023, Calendar.JANUARY, 27, 14, 12); + Date result = RoundDate.roundToNearestUnit(date, Calendar.DAY_OF_MONTH); + Date expected = RoundDate.getDate(2023, Calendar.JANUARY, 28, 0, 0); + assertEquals(expected, result); + } + + @Test + public void givenLocalDateTime_whenRoundToStartOfMonth_thenStartOfMonth() { + LocalDateTime dateTime = LocalDateTime.of(2023, 1, 27, 14, 12); + LocalDateTime result = RoundDate.roundToStartOfMonthUsingLocalDateTime(dateTime); + LocalDateTime expected = LocalDateTime.of(2023, 1, 1, 0, 0, 0); + assertEquals(expected, result); + } + + + @Test + public void givenZonedDateTime_whenRoundToStartOfMonth_thenStartOfMonth() { + ZonedDateTime dateTime = ZonedDateTime.of(2023, 1, 27, 14, 12, 0, 0, ZoneId.systemDefault()); + ZonedDateTime result = RoundDate.roundToStartOfMonthUsingZonedDateTime(dateTime); + ZonedDateTime expected = ZonedDateTime.of(2023, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()); + assertEquals(expected, result); + } + + @Test + public void givenLocalDateTime_whenRoundToEndOfWeek_thenEndOfWeek() { + LocalDateTime dateTime = LocalDateTime.of(2023, 1, 27, 14, 12); + LocalDateTime result = RoundDate.roundToEndOfWeekUsingLocalDateTime(dateTime); + LocalDateTime expected = LocalDateTime.of(2023, 1, 28, 23, 59, 59, 999); + assertEquals(expected, result); + } + + @Test + public void givenZonedDateTime_whenRoundToEndOfWeek_thenEndOfWeek() { + ZonedDateTime dateTime = ZonedDateTime.of(2023, 1, 27, 14, 12, 0, 0, ZoneId.systemDefault()); + ZonedDateTime result = RoundDate.roundToEndOfWeekUsingZonedDateTime(dateTime); + ZonedDateTime expected = ZonedDateTime.of(2023, 1, 28, 23, 59, 59, 999, ZoneId.systemDefault()); + assertEquals(expected, result); + } + +} From aaa4e333a66c8701d53f50331de07625cca074b2 Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Thu, 2 Nov 2023 00:32:13 +0530 Subject: [PATCH 319/831] [BAEL-7043] mutable strings (#15112) Co-authored-by: Bhaskar --- .../mutablestrings/CharsetUsageExample.java | 34 ++++++++++ .../MutableStringUsingCharset.java | 65 +++++++++++++++++++ .../mutablestrings/MutableStrings.java | 24 +++++++ .../mutablestring/CharsetUsageUnitTest.java | 17 +++++ .../MutableStringUsingCharsetUnitTest.java | 24 +++++++ 5 files changed, 164 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/CharsetUsageExample.java create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStringUsingCharset.java create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStrings.java create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/CharsetUsageUnitTest.java create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/MutableStringUsingCharsetUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/CharsetUsageExample.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/CharsetUsageExample.java new file mode 100644 index 0000000000..5ef8783ac8 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/CharsetUsageExample.java @@ -0,0 +1,34 @@ +package com.baeldung.mutablestrings; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; + +public class CharsetUsageExample { + + public ByteBuffer encodeString(String inputString) { + Charset charset = Charset.forName("UTF-8"); + CharsetEncoder encoder = charset.newEncoder(); + + CharBuffer charBuffer = CharBuffer.wrap(inputString); + ByteBuffer byteBuffer = ByteBuffer.allocate(50); + + encoder.encode(charBuffer, byteBuffer, true); // true indicates the end of input + byteBuffer.flip(); + return byteBuffer; + } + + public String decodeString(ByteBuffer byteBuffer) { + Charset charset = Charset.forName("UTF-8"); + CharsetDecoder decoder = charset.newDecoder(); + CharBuffer decodedCharBuffer = CharBuffer.allocate(50); + decoder.decode(byteBuffer, decodedCharBuffer, true); + decodedCharBuffer.flip(); + + return decodedCharBuffer.toString(); + } +} diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStringUsingCharset.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStringUsingCharset.java new file mode 100644 index 0000000000..3e4285c9d0 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStringUsingCharset.java @@ -0,0 +1,65 @@ +package com.baeldung.mutablestrings; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CoderResult; +import java.util.concurrent.atomic.AtomicReference; + +public class MutableStringUsingCharset { + + private final AtomicReference cbRef = new AtomicReference<>(); + private final Charset myCharset = new Charset("mycharset", null) { + @Override + public boolean contains(Charset cs) { + return false; + } + + @Override + public CharsetDecoder newDecoder() { + return new CharsetDecoder(this, 1.0f, 1.0f) { + @Override + protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { + cbRef.set(out); + while (in.remaining() > 0) { + out.append((char) in.get()); + } + return CoderResult.UNDERFLOW; + } + }; + } + + @Override + public CharsetEncoder newEncoder() { + CharsetEncoder cd = new CharsetEncoder(this, 1.0f, 1.0f) { + @Override + protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { + while (in.hasRemaining()) { + if (!out.hasRemaining()) { + return CoderResult.OVERFLOW; + } + char currentChar = in.get(); + if (currentChar > 127) { + return CoderResult.unmappableForLength(1); + } + out.put((byte) currentChar); + } + return CoderResult.UNDERFLOW; + } + }; + return cd; + } + }; + + public String createModifiableString(String s) { + return new String(s.getBytes(), myCharset); + } + + public void modifyString() { + CharBuffer cb = cbRef.get(); + cb.position(0); + cb.put("xyz"); + } +} diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStrings.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStrings.java new file mode 100644 index 0000000000..99994498b9 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/mutablestrings/MutableStrings.java @@ -0,0 +1,24 @@ +package com.baeldung.mutablestrings; + +import java.lang.reflect.Field; +import java.nio.charset.Charset; + +import com.google.errorprone.annotations.DoNotCall; + +public class MutableStrings { + + /** + * This involves using Reflection to change String fields and it is not encouraged to use this in programs. + * @throws NoSuchFieldException + * @throws IllegalAccessException + */ + @DoNotCall + public void mutableUsingReflection() throws NoSuchFieldException, IllegalAccessException { + String myString = "Hello World"; + String otherString = new String("Hello World"); + Field f = String.class.getDeclaredField("value"); + f.setAccessible(true); + f.set(myString, "Hi World".toCharArray()); + System.out.println(otherString); + } +} diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/CharsetUsageUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/CharsetUsageUnitTest.java new file mode 100644 index 0000000000..f009b0242f --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/CharsetUsageUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.mutablestring; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.baeldung.mutablestrings.CharsetUsageExample; + +public class CharsetUsageUnitTest { + + @Test + public void givenCharset_whenStringIsEncodedAndDecoded_thenGivesCorrectResult() { + CharsetUsageExample ch = new CharsetUsageExample(); + String inputString = "hello दुनिया"; + String result = ch.decodeString(ch.encodeString(inputString)); + Assertions.assertEquals(inputString, result); + } +} diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/MutableStringUsingCharsetUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/MutableStringUsingCharsetUnitTest.java new file mode 100644 index 0000000000..81a92038d5 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/mutablestring/MutableStringUsingCharsetUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.mutablestring; + +import org.junit.Assert; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import com.baeldung.mutablestrings.MutableStringUsingCharset; + +public class MutableStringUsingCharsetUnitTest { + @Test + @Disabled + /** + * This test is disabled as it works well for Java 8 and below + */ + public void givenCustomCharSet_whenStringUpdated_StringGetsMutated() throws Exception { + MutableStringUsingCharset ms = new MutableStringUsingCharset(); + String s = ms.createModifiableString("Hello"); + Assert.assertEquals("Hello", s); + ms.modifyString(); + Assert.assertEquals("something", s); + } + +} + From 7482aa3c25e702410158e6e9ecabc12ec3c49edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan=20Cardo=C5=9F?= <106325528+sodrac@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:13:08 +0200 Subject: [PATCH 320/831] BAEL-6874 test code for article (#15118) * BAEL-6819 convert from int to Long in Java * BAEL-6819 update package name * BAEL-6874 test code for article * BAEL-6874 rename test class --- .../GenericNumbersComparatorUnitTest.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java new file mode 100644 index 0000000000..37b971b5c5 --- /dev/null +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java @@ -0,0 +1,122 @@ +package com.baeldung.genericnumberscomparator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiFunction; +import java.util.function.BiPredicate; +import java.util.function.Function; + +import org.junit.jupiter.api.Test; + +class GenericNumbersComparatorUnitTest { + + public int compareDouble(Number num1, Number num2) { + return Double.compare(num1.doubleValue(), num2.doubleValue()); + } + + @Test + void givenNumbers_whenUseCompareDouble_thenWillExecuteComparison() { + assertEquals(0, compareDouble(5, 5.0)); + } + + public int compareTo(Integer int1, Integer int2) { + return int1.compareTo(int2); + } + + @Test + void givenNumbers_whenUseCompareTo_thenWillExecuteComparison() { + assertEquals(-1, compareTo(5, 7)); + } + + Map, BiFunction> comparisonMap = new HashMap<>(); + + public int compareUsingMap(Number num1, Number num2) { + comparisonMap.put(Integer.class, (a, b) -> ((Integer) num1).compareTo((Integer) num2)); + + return comparisonMap.get(num1.getClass()) + .apply(num1, num2); + } + + @Test + void givenNumbers_whenUseCompareUsingMap_thenWillExecuteComparison() { + assertEquals(-1, compareUsingMap(5, 7)); + } + + public interface NumberComparator { + int compare(Number num1, Number num2); + } + + @Test + void givenNumbers_whenUseProxy_thenWillExecuteComparison() { + NumberComparator proxy = (NumberComparator) Proxy.newProxyInstance(NumberComparator.class.getClassLoader(), new Class[] { NumberComparator.class }, + (p, method, args) -> Double.compare(((Number) args[0]).doubleValue(), ((Number) args[1]).doubleValue())); + assertEquals(0, proxy.compare(5, 5.0)); + } + + public int compareUsingReflection(Number num1, Number num2) throws Exception { + Method method = num1.getClass() + .getMethod("compareTo", num1.getClass()); + return (int) method.invoke(num1, num2); + } + + @Test + void givenNumbers_whenUseCompareUsingReflection_thenWillExecuteComparison() throws Exception { + assertEquals(-1, compareUsingReflection(5, 7)); + } + + interface NumberComparatorFactory { + Comparator getComparator(); + } + + class IntegerComparatorFactory implements NumberComparatorFactory { + @Override + public Comparator getComparator() { + return (num1, num2) -> ((Integer) num1).compareTo((Integer) num2); + } + } + + @Test + void givenNumbers_whenUseComparatorFactory_thenWillExecuteComparison() { + NumberComparatorFactory factory = new IntegerComparatorFactory(); + Comparator comparator = factory.getComparator(); + assertEquals(-1, comparator.compare(5, 7)); + } + + Function toDouble = Number::doubleValue; + BiPredicate isEqual = (num1, num2) -> toDouble.apply(num1) + .equals(toDouble.apply(num2)); + + @Test + void givenNumbers_whenUseIsEqual_thenWillExecuteComparison() { + assertEquals(true, isEqual.test(5, 5.0)); + } + + private Number someNumber = 5; + private Number anotherNumber = 5.0; + + Optional optNum1 = Optional.ofNullable(someNumber); + Optional optNum2 = Optional.ofNullable(anotherNumber); + int comparisonResult = optNum1.flatMap(n1 -> optNum2.map(n2 -> Double.compare(n1.doubleValue(), n2.doubleValue()))) + .orElse(0); + + @Test + void givenNumbers_whenUseComparisonResult_thenWillExecuteComparison() { + assertEquals(0, comparisonResult); + } + + private boolean someCondition = true; + Function dynamicFunction = someCondition ? Number::doubleValue : Number::intValue; + Comparator dynamicComparator = (num1, num2) -> ((Comparable) dynamicFunction.apply(num1)).compareTo(dynamicFunction.apply(num2)); + + @Test + void givenNumbers_whenUseDynamicComparator_thenWillExecuteComparison() { + assertEquals(0, dynamicComparator.compare(5, 5.0)); + } + +} From dad8a5c02156e46917631135b58565f4e61cd394 Mon Sep 17 00:00:00 2001 From: mikr Date: Wed, 1 Nov 2023 21:14:14 +0100 Subject: [PATCH 321/831] Update readme --- core-java-modules/core-java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index 03e980e5a5..dbbfcc79b6 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -14,3 +14,4 @@ Listed here there are only those articles that does not fit into other core-java - [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions) - [Java Multi-line String](https://www.baeldung.com/java-multiline-string) - [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency) +- [How to Iterate Over the String Characters in Java](https://www.baeldung.com/java-iterate-string-characters) From d8fb8b381f99060455efce564d3cc1f796a41577 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 2 Nov 2023 02:28:53 +0100 Subject: [PATCH 322/831] [linkedhashmap-first-last] get first and last entry from LinkedHashMap (#15066) * [linkedhashmap-first-last] get first and last entry from LinkedHashMap * [linkedhashmap-first-last] add the stream approach --- .../core-java-collections-maps-7/pom.xml | 13 +++ ...AndLastEntryFromLinkedHashMapUnitTest.java | 85 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/linkedhashmapfirstandlastentry/GetFirstAndLastEntryFromLinkedHashMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index bcc0915073..cefee201cc 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -79,5 +79,18 @@ 1.5 + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.util=ALL-UNNAMED + + + + + diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/linkedhashmapfirstandlastentry/GetFirstAndLastEntryFromLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/linkedhashmapfirstandlastentry/GetFirstAndLastEntryFromLinkedHashMapUnitTest.java new file mode 100644 index 0000000000..b872e8bdda --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/linkedhashmapfirstandlastentry/GetFirstAndLastEntryFromLinkedHashMapUnitTest.java @@ -0,0 +1,85 @@ +package com.baeldung.map.linkedhashmapfirstandlastentry; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class GetFirstAndLastEntryFromLinkedHashMapUnitTest { + private static final LinkedHashMap THE_MAP = new LinkedHashMap<>(); + + static { + THE_MAP.put("key one", "a1 b1 c1"); + THE_MAP.put("key two", "a2 b2 c2"); + THE_MAP.put("key three", "a3 b3 c3"); + THE_MAP.put("key four", "a4 b4 c4"); + } + + @Test + void whenIteratingEntrySet_thenGetExpectedResult() { + Entry firstEntry = THE_MAP.entrySet().iterator().next(); + assertEquals("key one", firstEntry.getKey()); + assertEquals("a1 b1 c1", firstEntry.getValue()); + + Entry lastEntry = null; + Iterator> it = THE_MAP.entrySet().iterator(); + while (it.hasNext()) { + lastEntry = it.next(); + } + + assertNotNull(lastEntry); + assertEquals("key four", lastEntry.getKey()); + assertEquals("a4 b4 c4", lastEntry.getValue()); + + } + + @Test + void whenConvertingEntriesToArray_thenGetExpectedResult() { + + Entry[] theArray = new Entry[THE_MAP.size()]; + THE_MAP.entrySet().toArray(theArray); + + Entry firstEntry = theArray[0]; + assertEquals("key one", firstEntry.getKey()); + assertEquals("a1 b1 c1", firstEntry.getValue()); + + Entry lastEntry = theArray[THE_MAP.size() - 1]; + assertEquals("key four", lastEntry.getKey()); + assertEquals("a4 b4 c4", lastEntry.getValue()); + } + + @Test + void whenUsingStreamAPI_thenGetExpectedResult() { + Entry firstEntry = THE_MAP.entrySet().stream().findFirst().get(); + assertEquals("key one", firstEntry.getKey()); + assertEquals("a1 b1 c1", firstEntry.getValue()); + + Entry lastEntry = THE_MAP.entrySet().stream().skip(THE_MAP.size() - 1).findFirst().get(); + + assertNotNull(lastEntry); + assertEquals("key four", lastEntry.getKey()); + assertEquals("a4 b4 c4", lastEntry.getValue()); + } + + @Test + void whenUsingReflection_thenGetExpectedResult() throws NoSuchFieldException, IllegalAccessException { + Field head = THE_MAP.getClass().getDeclaredField("head"); + head.setAccessible(true); + Entry firstEntry = (Entry) head.get(THE_MAP); + assertEquals("key one", firstEntry.getKey()); + assertEquals("a1 b1 c1", firstEntry.getValue()); + + Field tail = THE_MAP.getClass().getDeclaredField("tail"); + tail.setAccessible(true); + Entry lastEntry = (Entry) tail.get(THE_MAP); + assertEquals("key four", lastEntry.getKey()); + assertEquals("a4 b4 c4", lastEntry.getValue()); + } + + +} \ No newline at end of file From b946f580f48f8dd33a12f192544aea0176a6846b Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Thu, 2 Nov 2023 09:39:17 +0700 Subject: [PATCH 323/831] Update core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java Minor style issue: put a space between () and { in each of these methods Co-authored-by: Liam Williams --- .../main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index bc8177837c..b47fee1968 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -8,7 +8,7 @@ import java.util.UUID; */ @SuppressWarnings("unused") public class UUIDPositiveLongGenerator { - public long getLeastSignificantBits(){ + public long getLeastSignificantBits() { return Math.abs(UUID.randomUUID().getLeastSignificantBits()); } From 9fe75192ecea51637320985266159328aca02c4a Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Thu, 2 Nov 2023 09:39:43 +0700 Subject: [PATCH 324/831] Update core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java assert that the value is positive Co-authored-by: Liam Williams --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index cd538af523..854279446b 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -43,6 +43,7 @@ public class UUIDPositiveLongGeneratorUnitTest { int collisions = 0; for (int i = 0; i < n; i++) { long uniqueValue = (long) method.invoke(uuidLongGenerator); + assertThat(uniqueValue).isPositive(); if (!uniqueValues.add(uniqueValue)) { collisions++; } From f25f06795b20c4d8947efcbaf779a02bc25b32e3 Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Thu, 2 Nov 2023 09:40:04 +0700 Subject: [PATCH 325/831] Update core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java Simplify the throws clause Co-authored-by: Liam Williams --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 854279446b..90ba11984f 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -38,7 +38,7 @@ public class UUIDPositiveLongGeneratorUnitTest { } - private void collisionCheck(Method method) throws InvocationTargetException, IllegalAccessException { + private void collisionCheck(Method method) throws Exception { Set uniqueValues = new HashSet<>(); int collisions = 0; for (int i = 0; i < n; i++) { From a5d0a15419cfcfeb3d0843e381188a58996bbe3e Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Thu, 2 Nov 2023 09:40:20 +0700 Subject: [PATCH 326/831] Update core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java Simplify the throws clause Co-authored-by: Liam Williams --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 90ba11984f..ebb061216b 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -19,7 +19,7 @@ public class UUIDPositiveLongGeneratorUnitTest { private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); @Test - void whenForeachGenerateLongValue_thenCollisionsCheck() throws InvocationTargetException, IllegalAccessException { + void whenForeachGenerateLongValue_thenCollisionsCheck() throws Exception { printTableHeader(); for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { collisionCheck(method); From 8f1a091a431bcd423d59343327f8a9b8540fc9df Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Thu, 2 Nov 2023 09:42:31 +0700 Subject: [PATCH 327/831] update : add space after () --- .../com/baeldung/uuid/UUIDPositiveLongGenerator.java | 12 ++++++------ .../uuid/UUIDPositiveLongGeneratorUnitTest.java | 7 +++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index b47fee1968..7b98c05684 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -12,15 +12,15 @@ public class UUIDPositiveLongGenerator { return Math.abs(UUID.randomUUID().getLeastSignificantBits()); } - public long getMostSignificantBits(){ + public long getMostSignificantBits() { return Math.abs(UUID.randomUUID().getMostSignificantBits()); } - public long gethashCode(){ + public long gethashCode() { return Math.abs(UUID.randomUUID().toString().hashCode()); } - public long combineByteBuffer(){ + public long combineByteBuffer() { UUID uuid = UUID.randomUUID(); ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); @@ -29,20 +29,20 @@ public class UUIDPositiveLongGenerator { return Math.abs(bb.getLong()); } - public long combineBitwise(){ + public long combineBitwise() { UUID uniqueUUID; uniqueUUID = UUID.randomUUID(); return Math.abs((uniqueUUID.getMostSignificantBits() << 32) | (uniqueUUID.getLeastSignificantBits() & 0xFFFFFFFFL)); } - public long combineDirect(){ + public long combineDirect() { UUID uniqueUUID = UUID.randomUUID(); long mostSignificantBits = uniqueUUID.getMostSignificantBits(); long leastSignificantBits = uniqueUUID.getLeastSignificantBits(); return Math.abs(mostSignificantBits ^ (leastSignificantBits >> 1)); } - public long combinePermutation(){ + public long combinePermutation() { UUID uuid = UUID.randomUUID(); long mostSigBits = uuid.getMostSignificantBits(); long leastSigBits = uuid.getLeastSignificantBits(); diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index ebb061216b..cc377254c4 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.DecimalFormat; import java.util.HashSet; @@ -13,7 +12,7 @@ import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; public class UUIDPositiveLongGeneratorUnitTest { - private final static int n = 1000000; + private final static int N = 1000000; private final static double COLLISION_THRESHOLD = 0.001; private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); @@ -41,14 +40,14 @@ public class UUIDPositiveLongGeneratorUnitTest { private void collisionCheck(Method method) throws Exception { Set uniqueValues = new HashSet<>(); int collisions = 0; - for (int i = 0; i < n; i++) { + for (int i = 0; i < N; i++) { long uniqueValue = (long) method.invoke(uuidLongGenerator); assertThat(uniqueValue).isPositive(); if (!uniqueValues.add(uniqueValue)) { collisions++; } } - double collisionsProbability = (double) collisions / n; + double collisionsProbability = (double) collisions / N; printOutput(method.getName(), collisions, collisionsProbability); assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); } From 57840bb083acfee2834a7fec5fe0da38e19c228a Mon Sep 17 00:00:00 2001 From: Palaniappan Arunachalam Date: Thu, 2 Nov 2023 09:28:54 +0530 Subject: [PATCH 328/831] BAEL-4200: JNDI - What Is java:comp/env? (#15081) --- .../com/baeldung/jndi/JndiNamingUnitTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiNamingUnitTest.java diff --git a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiNamingUnitTest.java b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiNamingUnitTest.java new file mode 100644 index 0000000000..66d8d57d4e --- /dev/null +++ b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiNamingUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.jndi; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.jndi.JndiTemplate; +import org.springframework.mock.jndi.SimpleNamingContextBuilder; + +import javax.naming.*; +import javax.sql.DataSource; + +import java.util.Enumeration; + +import static org.junit.jupiter.api.Assertions.*; + +class JndiNamingUnitTest { + + private static InitialContext context; + private static DriverManagerDataSource dataSource; + + @BeforeAll + static void setUp() throws Exception { + SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder(); + dataSource = new DriverManagerDataSource("jdbc:h2:mem:mydb"); + builder.activate(); + + JndiTemplate jndiTemplate = new JndiTemplate(); + context = (InitialContext) jndiTemplate.getContext(); + + dataSource.setDriverClassName("org.h2.Driver"); + context.bind("java:comp/env/jdbc/datasource", dataSource); + } + + @Test + void givenACompositeName_whenAddingAnElement_thenNameIsAdded() throws Exception { + Name objectName = new CompositeName("java:comp/env/jdbc"); + + Enumeration items = objectName.getAll(); + while(items.hasMoreElements()) { + System.out.println(items.nextElement()); + } + + objectName.add("New Name"); + + assertEquals("env", objectName.get(1)); + assertEquals("New Name", objectName.get(objectName.size() - 1)); + } + + @Test + void givenContext_whenLookupByName_thenReturnsValidObject() throws Exception { + DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/datasource"); + + assertNotNull(ds); + assertNotNull(ds.getConnection()); + } + + @Test + void givenSubContext_whenLookupByName_thenReturnsValidObject() throws Exception { + Context subContext = (Context) context.lookup("java:comp/env"); + DataSource ds = (DataSource) subContext.lookup("jdbc/datasource"); + + assertNotNull(ds); + assertNotNull(ds.getConnection()); + } + + @AfterAll + static void tearDown() throws Exception { + context.close(); + } + +} From 69d17b634d22690d4a7981287126e9837a5c9e6d Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Thu, 2 Nov 2023 11:25:19 +0700 Subject: [PATCH 329/831] N to NUMBER_OF_CHECKS --- .../baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index cc377254c4..9db7a2f271 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -12,7 +12,7 @@ import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; public class UUIDPositiveLongGeneratorUnitTest { - private final static int N = 1000000; + private final static int NUMBER_OF_CHECKS = 1000000; private final static double COLLISION_THRESHOLD = 0.001; private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); @@ -40,14 +40,14 @@ public class UUIDPositiveLongGeneratorUnitTest { private void collisionCheck(Method method) throws Exception { Set uniqueValues = new HashSet<>(); int collisions = 0; - for (int i = 0; i < N; i++) { + for (int i = 0; i < NUMBER_OF_CHECKS; i++) { long uniqueValue = (long) method.invoke(uuidLongGenerator); assertThat(uniqueValue).isPositive(); if (!uniqueValues.add(uniqueValue)) { collisions++; } } - double collisionsProbability = (double) collisions / N; + double collisionsProbability = (double) collisions / NUMBER_OF_CHECKS; printOutput(method.getName(), collisions, collisionsProbability); assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); } From 0f222559dc3a77c7e557682b7b410bc2305058e2 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Thu, 2 Nov 2023 14:16:43 +0700 Subject: [PATCH 330/831] simplyfying log --- .../core-java-uuid/src/test/resources/logback.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml index 56af2d397e..092215ceed 100644 --- a/core-java-modules/core-java-uuid/src/test/resources/logback.xml +++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml @@ -2,8 +2,8 @@ - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + %d{HH:mm:ss} - %msg%n + @@ -12,6 +12,7 @@ + From 7cc4de47ef85d2002fd9a13db57e3c455fd9e2c6 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Thu, 2 Nov 2023 16:55:49 +0700 Subject: [PATCH 331/831] remove some space --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 9db7a2f271..fab07df2a0 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -25,7 +25,6 @@ public class UUIDPositiveLongGeneratorUnitTest { } } - private void printTableHeader() { logger.info(String.format("%-30s %-15s %-15s", "Approach(method name)", "collisions", "probability")); logger.info("-----------------------------------------------------------------------"); @@ -36,7 +35,6 @@ public class UUIDPositiveLongGeneratorUnitTest { logger.info(String.format("%-30s %-15s %-15s", method, collisionsCount, decimalFormat.format(collisionsProbability))); } - private void collisionCheck(Method method) throws Exception { Set uniqueValues = new HashSet<>(); int collisions = 0; From 18220b12af536a7c75860210c86ec9ea6ba0dc55 Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Thu, 2 Nov 2023 21:05:07 +0700 Subject: [PATCH 332/831] Update core-java-modules/core-java-uuid/src/test/resources/logback.xml Ok.. Co-authored-by: Liam Williams --- core-java-modules/core-java-uuid/src/test/resources/logback.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml index 092215ceed..8d3b4ff505 100644 --- a/core-java-modules/core-java-uuid/src/test/resources/logback.xml +++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml @@ -12,7 +12,6 @@ - From 39bc0b9eaad2eb6a2ee06d30a965496252ffeccf Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Thu, 2 Nov 2023 21:08:06 +0700 Subject: [PATCH 333/831] logback --- .../core-java-uuid/src/test/resources/logback.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml index 8d3b4ff505..a076f8db47 100644 --- a/core-java-modules/core-java-uuid/src/test/resources/logback.xml +++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml @@ -2,8 +2,7 @@ - %d{HH:mm:ss} - %msg%n - + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n From a5d58617e2aac4e7605914a3f771d1a6617d9e7f Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 2 Nov 2023 20:21:59 +0530 Subject: [PATCH 334/831] BAEL-7177 Modifying Objects within Stream while iterating --- .../modifystream/entity/ImmutablePerson.java | 25 ++++ .../baledung/modifystream/entity/Person.java | 27 ++++ .../modifystream/ModifyStreamUnitTest.java | 140 ++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/ImmutablePerson.java create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/Person.java create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/ImmutablePerson.java b/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/ImmutablePerson.java new file mode 100644 index 0000000000..bb7f3b8eb3 --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/ImmutablePerson.java @@ -0,0 +1,25 @@ +package com.baledung.modifystream.entity; + +public class ImmutablePerson { + + private String name; + private String email; + + public ImmutablePerson(String name, String email) { + this.name = name; + this.email = email; + } + + public ImmutablePerson withEmail(String email) { + + return new ImmutablePerson(this.name, email); + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } +} diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/Person.java b/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/Person.java new file mode 100644 index 0000000000..c82c159059 --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baledung/modifystream/entity/Person.java @@ -0,0 +1,27 @@ +package com.baledung.modifystream.entity; + +public class Person { + private String name; + private String email; + + public Person(String name, String email) { + this.name = name; + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java new file mode 100644 index 0000000000..72183ec94a --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java @@ -0,0 +1,140 @@ +package com.baeldung.modifystream; + +import com.baledung.modifystream.entity.ImmutablePerson; +import com.baledung.modifystream.entity.Person; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ModifyStreamUnitTest { + Logger logger = LoggerFactory.getLogger(ModifyStreamUnitTest.class); + List personLst = new ArrayList(); + List immutablePersonList = new ArrayList(); + + @BeforeEach + void prepare() { + Person person1 = new Person("John", "john@gmail.com"); + Person person2 = new Person("Peter", "peter@gmail.com"); + Person person3 = new Person("Mary", "mary@gmail.com"); + Person person4 = new Person("William", "william@gmail.com"); + + personLst.add(person1); + personLst.add(person2); + personLst.add(person3); + personLst.add(person4); + } + + @BeforeEach + void prepareImmutablePerson() { + ImmutablePerson immutablePerson1 = new ImmutablePerson("John", "john@gmail.com"); + ImmutablePerson immutablePerson2 = new ImmutablePerson("Peter", "peter@gmail.com"); + ImmutablePerson immutablePerson3 = new ImmutablePerson("Mary", "mary@gmail.com"); + ImmutablePerson immutablePerson4 = new ImmutablePerson("William", "william@gmail.com"); + + immutablePersonList.add(immutablePerson1); + immutablePersonList.add(immutablePerson2); + immutablePersonList.add(immutablePerson3); + immutablePersonList.add(immutablePerson4); + } + + @Test + void givenPersonLst_whenRemoveWhileIterating_thenThrowException() { + assertThrows(NullPointerException.class, () -> { + personLst.stream().forEach(e -> { + if(e.getName().equals("John")) { + personLst.remove(e); + } + }); + }); + } + + @Test + void givenPersonLst_whenRemoveWhileIteratingWithForEach_thenThrowException() { + assertThrows(ConcurrentModificationException.class, () -> { + personLst.forEach(e -> { + if(e.getName().equals("John")) { + personLst.remove(e); + } + }); + }); + } + + @Test + void givenPersonLst_whenRemoveWhileIterating_thenPersonRemoved() { + assertEquals(4, personLst.size()); + + CopyOnWriteArrayList cps = new CopyOnWriteArrayList<>(personLst); + cps.stream().forEach(e -> { + if(e.getName().equals("John")) { + cps.remove(e); + } + }); + + assertEquals(3, cps.size()); + } + + + @Test + void givenPersonLst_whenRemovePersonWithFilter_thenPersonRemoved() { + assertEquals(4, personLst.size()); + + List newPersonLst = personLst.stream() + .filter(e -> !e.getName().equals("John")) + .collect(Collectors.toList()); + + assertEquals(3, newPersonLst.size()); + } + + @Test + void givenPersonLst_whenRemovePersonWithRemoveIf_thenPersonRemoved() { + assertEquals(4, personLst.size()); + + personLst.removeIf(e -> e.getName().equals("John")); + + assertEquals(3, personLst.size()); + } + + @Test + void givenPersonLst_whenUpdatePersonEmailByInterferingWithForEach_thenPersonEmailUpdated() { + personLst.stream().forEach(e -> e.setEmail(e.getEmail().toUpperCase())); + + personLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + } + + @Test + void givenPersonLst_whenUpdatePersonEmailWithMapMethod_thenPersonEmailUpdated() { + List newPersonLst = personLst.stream() + .map(e -> new Person(e.getName(), e.getEmail().toUpperCase())) + .collect(Collectors.toList()); + + newPersonLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + } + + @Test + void givenPersonLst_whenUpdateImmutablePersonEmailWithMapMethod_thenPersonEmailUpdated() { + List newImmutablePersonLst = immutablePersonList.stream() + .map(e -> e.withEmail(e.getEmail().toUpperCase())) + .collect(Collectors.toList()); + + newImmutablePersonLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + } + @Test + void givenPersonLst_whenUpdatePersonEmailByInterferingWithPeek_thenPersonEmailUpdated() { + personLst.stream() + .peek(e -> e.setEmail(e.getEmail().toUpperCase())) + .collect(Collectors.toList()); + + personLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + } + +} From aa2701442567f6efc2a50ef095ef449b836546eb Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 2 Nov 2023 23:12:45 +0530 Subject: [PATCH 335/831] BAEL-7177 Modifying Objects within Stream while iterating --- .../modifystream/ModifyStreamUnitTest.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java index 72183ec94a..f5fab408b8 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; public class ModifyStreamUnitTest { Logger logger = LoggerFactory.getLogger(ModifyStreamUnitTest.class); - List personLst = new ArrayList(); + List personList = new ArrayList(); List immutablePersonList = new ArrayList(); @BeforeEach @@ -28,10 +28,10 @@ public class ModifyStreamUnitTest { Person person3 = new Person("Mary", "mary@gmail.com"); Person person4 = new Person("William", "william@gmail.com"); - personLst.add(person1); - personLst.add(person2); - personLst.add(person3); - personLst.add(person4); + personList.add(person1); + personList.add(person2); + personList.add(person3); + personList.add(person4); } @BeforeEach @@ -48,32 +48,32 @@ public class ModifyStreamUnitTest { } @Test - void givenPersonLst_whenRemoveWhileIterating_thenThrowException() { + void givenPersonList_whenRemoveWhileIterating_thenThrowException() { assertThrows(NullPointerException.class, () -> { - personLst.stream().forEach(e -> { + personList.stream().forEach(e -> { if(e.getName().equals("John")) { - personLst.remove(e); + personList.remove(e); } }); }); } @Test - void givenPersonLst_whenRemoveWhileIteratingWithForEach_thenThrowException() { + void givenPersonList_whenRemoveWhileIteratingWithForEach_thenThrowException() { assertThrows(ConcurrentModificationException.class, () -> { - personLst.forEach(e -> { + personList.forEach(e -> { if(e.getName().equals("John")) { - personLst.remove(e); + personList.remove(e); } }); }); } @Test - void givenPersonLst_whenRemoveWhileIterating_thenPersonRemoved() { - assertEquals(4, personLst.size()); + void givenPersonList_whenRemoveWhileIterating_thenPersonRemoved() { + assertEquals(4, personList.size()); - CopyOnWriteArrayList cps = new CopyOnWriteArrayList<>(personLst); + CopyOnWriteArrayList cps = new CopyOnWriteArrayList<>(personList); cps.stream().forEach(e -> { if(e.getName().equals("John")) { cps.remove(e); @@ -85,56 +85,56 @@ public class ModifyStreamUnitTest { @Test - void givenPersonLst_whenRemovePersonWithFilter_thenPersonRemoved() { - assertEquals(4, personLst.size()); + void givenPersonList_whenRemovePersonWithFilter_thenPersonRemoved() { + assertEquals(4, personList.size()); - List newPersonLst = personLst.stream() + List newPersonList = personList.stream() .filter(e -> !e.getName().equals("John")) .collect(Collectors.toList()); - assertEquals(3, newPersonLst.size()); + assertEquals(3, newPersonList.size()); } @Test - void givenPersonLst_whenRemovePersonWithRemoveIf_thenPersonRemoved() { - assertEquals(4, personLst.size()); + void givenPersonList_whenRemovePersonWithRemoveIf_thenPersonRemoved() { + assertEquals(4, personList.size()); - personLst.removeIf(e -> e.getName().equals("John")); + personList.removeIf(e -> e.getName().equals("John")); - assertEquals(3, personLst.size()); + assertEquals(3, personList.size()); } @Test - void givenPersonLst_whenUpdatePersonEmailByInterferingWithForEach_thenPersonEmailUpdated() { - personLst.stream().forEach(e -> e.setEmail(e.getEmail().toUpperCase())); + void givenPersonList_whenUpdatePersonEmailByInterferingWithForEach_thenPersonEmailUpdated() { + personList.stream().forEach(e -> e.setEmail(e.getEmail().toUpperCase())); - personLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + personList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } @Test - void givenPersonLst_whenUpdatePersonEmailWithMapMethod_thenPersonEmailUpdated() { - List newPersonLst = personLst.stream() + void givenPersonList_whenUpdatePersonEmailWithMapMethod_thenPersonEmailUpdated() { + List newPersonList = personList.stream() .map(e -> new Person(e.getName(), e.getEmail().toUpperCase())) .collect(Collectors.toList()); - newPersonLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + newPersonList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } @Test - void givenPersonLst_whenUpdateImmutablePersonEmailWithMapMethod_thenPersonEmailUpdated() { - List newImmutablePersonLst = immutablePersonList.stream() + void givenPersonList_whenUpdateImmutablePersonEmailWithMapMethod_thenPersonEmailUpdated() { + List newImmutablePersonList = immutablePersonList.stream() .map(e -> e.withEmail(e.getEmail().toUpperCase())) .collect(Collectors.toList()); - newImmutablePersonLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + newImmutablePersonList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } @Test - void givenPersonLst_whenUpdatePersonEmailByInterferingWithPeek_thenPersonEmailUpdated() { - personLst.stream() + void givenPersonList_whenUpdatePersonEmailByInterferingWithPeek_thenPersonEmailUpdated() { + personList.stream() .peek(e -> e.setEmail(e.getEmail().toUpperCase())) .collect(Collectors.toList()); - personLst.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); + personList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } } From 3fe81a3e075ae05044038788b23fa8729115f734 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Fri, 3 Nov 2023 03:49:06 +0530 Subject: [PATCH 336/831] Formatting changes --- .../core-java-persistence-3/pom.xml | 6 --- .../ResultSetToMapUnitTest.java | 44 ++++++++----------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/persistence-modules/core-java-persistence-3/pom.xml b/persistence-modules/core-java-persistence-3/pom.xml index 6868da27be..26ac2a5218 100644 --- a/persistence-modules/core-java-persistence-3/pom.xml +++ b/persistence-modules/core-java-persistence-3/pom.xml @@ -16,11 +16,6 @@ h2 ${h2.version} - - org.springframework - spring-jdbc - ${spring-jdbc.version} - commons-dbutils commons-dbutils @@ -29,7 +24,6 @@ 2.1.214 - 5.3.29 1.8.1 \ No newline at end of file diff --git a/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java index b483cc04c9..c8a6351804 100644 --- a/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java +++ b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java @@ -33,48 +33,43 @@ public class ResultSetToMapUnitTest { private void initialDataSetup() throws SQLException { Statement statement = connection.createStatement(); - String sql = "CREATE TABLE EMPLOYEE (empId INTEGER not null, empName VARCHAR(50), empCity VARCHAR(50), PRIMARY KEY (empId))"; - statement.executeUpdate(sql); - List sqlQueryList = Arrays.asList("INSERT INTO EMPLOYEE VALUES (1, 'Steve','London')", "INSERT INTO EMPLOYEE VALUES (2, 'John','London')", "INSERT INTO EMPLOYEE VALUES (3, 'David', 'Sydney')", - "INSERT INTO EMPLOYEE VALUES (4, 'Kevin','London')", "INSERT INTO EMPLOYEE VALUES (5, 'Jade', 'Sydney')"); + String ddlQuery = "CREATE TABLE employee (empId INTEGER not null, empName VARCHAR(50), empCity VARCHAR(50), PRIMARY KEY (empId))"; + statement.execute(ddlQuery); + List sqlQueryList = Arrays.asList("INSERT INTO employee VALUES (1, 'Steve','London')", "INSERT INTO employee VALUES (2, 'John','London')", "INSERT INTO employee VALUES (3, 'David', 'Sydney')", + "INSERT INTO employee VALUES (4, 'Kevin','London')", "INSERT INTO employee VALUES (5, 'Jade', 'Sydney')"); + for (String query : sqlQueryList) { - statement.executeUpdate(query); + statement.execute(query); } } @Test - public void whenUsingNativeJava_thenConvertResultSetToMap() throws SQLException { - ResultSet resultSet = connection.prepareStatement("SELECT * FROM EMPLOYEE") - .executeQuery(); + public void whenUsingContainsKey_thenConvertResultSetToMap() throws SQLException { + ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee").executeQuery(); Map> valueMap = new HashMap<>(); while (resultSet.next()) { String empCity = resultSet.getString("empCity"); String empName = resultSet.getString("empName"); if (!valueMap.containsKey(empCity)) { - valueMap.putIfAbsent(empCity, new ArrayList<>()); + valueMap.put(empCity, new ArrayList<>()); } - valueMap.get(empCity) - .add(empName); + valueMap.get(empCity).add(empName); } - assertEquals(3, valueMap.get("London") - .size()); + assertEquals(3, valueMap.get("London").size()); } @Test - public void whenUsingLambda_thenConvertResultSetToMap() throws SQLException { - ResultSet resultSet = connection.prepareStatement("SELECT * FROM EMPLOYEE") - .executeQuery(); + public void whenUsingComputeIfAbsent_thenConvertResultSetToMap() throws SQLException { + ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee").executeQuery(); Map> valueMap = new HashMap<>(); while (resultSet.next()) { String empCity = resultSet.getString("empCity"); String empName = resultSet.getString("empName"); - valueMap.computeIfAbsent(empCity, data -> new ArrayList<>()) - .add(empName); + valueMap.computeIfAbsent(empCity, data -> new ArrayList<>()).add(empName); } - assertEquals(3, valueMap.get("London") - .size()); + assertEquals(3, valueMap.get("London").size()); } @Test @@ -86,16 +81,15 @@ public class ResultSetToMapUnitTest { while (resultSet.next()) { String empCity = resultSet.getString("empCity"); String empName = resultSet.getString("empName"); - result.computeIfAbsent(empCity, data -> new ArrayList<>()) - .add(empName); + result.computeIfAbsent(empCity, data -> new ArrayList<>()).add(empName); } return result; } }; + QueryRunner run = new QueryRunner(); - Map> valueMap = run.query(connection, "SELECT * FROM EMPLOYEE", handler); - assertEquals(3, valueMap.get("London") - .size()); + Map> valueMap = run.query(connection, "SELECT * FROM employee", handler); + assertEquals(3, valueMap.get("London").size()); } @After From b7d743c62973913c244eed64befca97b45c6c8ee Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:40:36 -0400 Subject: [PATCH 337/831] Incorporated Review comments --- .../kafka/message/ordering/Config.java | 5 +- .../ordering/ConsumerConfigurations.java | 36 -------------- .../ExtSeqWithTimeWindowConsumer.java | 49 ------------------- .../ExtSeqWithTimeWindowProducer.java | 34 ------------- .../ordering/MultiPartitionConsumer.java | 39 --------------- .../ordering/MultiPartitionProducer.java | 33 ------------- .../ordering/ProducerConfigurations.java | 30 ------------ .../ordering/SinglePartitionConsumer.java | 37 -------------- .../ordering/SinglePartitionProducer.java | 35 ------------- .../ExtSeqWithTimeWindowIntegrationTest.java | 16 +++--- .../MultiplePartitionIntegrationTest.java | 15 +++--- .../SinglePartitionIntegrationTest.java | 15 +++--- 12 files changed, 25 insertions(+), 319 deletions(-) delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java delete mode 100644 apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java index 12acfecf51..9cc6314309 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java @@ -2,7 +2,10 @@ package com.baeldung.kafka.message.ordering; public class Config { public static final String CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS = "value.deserializer.serializedClass"; - public static final String KAFKA_LOCAL = "localhost:9092"; public static final String MULTI_PARTITION_TOPIC = "multi_partition_topic"; public static final String SINGLE_PARTITION_TOPIC = "single_partition_topic"; + + public static final int MULTIPLE_PARTITIONS = 5; + public static final int SINGLE_PARTITION = 1; + public static short REPLICATION_FACTOR = 1; } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java deleted file mode 100644 index 5b5a1f8e0b..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ConsumerConfigurations.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.common.serialization.StringDeserializer; -import org.apache.kafka.common.serialization.StringSerializer; - -import java.time.Duration; -import java.util.Collections; -import java.util.Properties; - -public class ConsumerConfigurations { - public static void main(String[] args) { - Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); - props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "500"); - props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, "1"); - props.put(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG, "500"); - Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); - - while (true) { - ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); - records.forEach(record -> { - System.out.println("Partition: " + record.partition() + ", Message: " + record.value()); - }); - } - } -} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java deleted file mode 100644 index 06cb7104b7..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowConsumer.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.common.serialization.LongDeserializer; - -import java.time.Duration; -import java.util.*; - -public class ExtSeqWithTimeWindowConsumer { - private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); - - public static void main(String[] args) { - Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); - props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); - Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); - List buffer = new ArrayList<>(); - long lastProcessedTime = System.nanoTime(); - while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); - records.forEach(record -> { - buffer.add(record.value()); - }); - if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_NS) { - processBuffer(buffer); - lastProcessedTime = System.nanoTime(); - } - } - } - - private static void processBuffer(List buffer) { - Collections.sort(buffer); - buffer.forEach(userEvent -> { - System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", User Event Id: " + userEvent.getUserEventId()); - }); - buffer.clear(); - } -} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java deleted file mode 100644 index 73a62c0bf2..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowProducer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.serialization.LongSerializer; - -import java.util.Properties; -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class ExtSeqWithTimeWindowProducer { - public static void main(String[] args) throws ExecutionException, InterruptedException { - Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long sequenceNumber = 1; sequenceNumber <= 10 ; sequenceNumber++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); - userEvent.setEventNanoTime(System.nanoTime()); - userEvent.setGlobalSequenceNumber(sequenceNumber); - Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); - RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); - } - producer.close(); - System.out.println("ExternalSequencingProducer Completed."); - } -} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java deleted file mode 100644 index 82f05cc80e..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionConsumer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.common.serialization.LongDeserializer; - -import java.time.Duration; -import java.util.Collections; -import java.util.Properties; - -public class MultiPartitionConsumer { - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); - - public static void main(String[] args) { - Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); - props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); - while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); - records.forEach(record -> { - UserEvent userEvent = record.value(); - if (userEvent != null) { - System.out.println("User Event ID: " + userEvent.getUserEventId()); - } - }); - } - } -} - diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java deleted file mode 100644 index 52da49ab80..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/MultiPartitionProducer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.serialization.LongSerializer; - -import java.util.Properties; -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class MultiPartitionProducer { - public static void main(String[] args) throws ExecutionException, InterruptedException { - Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long count = 1; count <= 10 ; count++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); - userEvent.setEventNanoTime(System.nanoTime()); - Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, count, userEvent)); - RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); - } - producer.close(); - System.out.println("MultiPartitionProducer Completed."); - } -} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java deleted file mode 100644 index 79fc42be3d..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/ProducerConfigurations.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.serialization.StringSerializer; - -import java.util.Properties; - -public class ProducerConfigurations { - public static void main(String[] args) { - Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); - props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, "1"); - props.put(ProducerConfig.BATCH_SIZE_CONFIG, "16384"); - props.put(ProducerConfig.LINGER_MS_CONFIG, "5"); - props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true"); - KafkaProducer producer = new KafkaProducer<>(props); - - for (int i = 0; i < 10; i++) { - String key = "Key-" + (i % 5); // Assuming 5 partitions - producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, key, "Message-" + i)); - } - - producer.close(); - System.out.println("Producer Configurations Completed."); - } -} diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java deleted file mode 100644 index 1c50f3cf7a..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionConsumer.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.ConsumerRecords; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.common.serialization.LongDeserializer; - -import java.time.Duration; -import java.util.Collections; -import java.util.Properties; - -public class SinglePartitionConsumer { - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(100); - - public static void main(String[] args) { - Properties props = new Properties(); - props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName()); - props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JacksonDeserializer.class.getName()); - props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); - props.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); - Consumer consumer = new KafkaConsumer<>(props); - consumer.subscribe(Collections.singletonList(Config.SINGLE_PARTITION_TOPIC)); - while (true) { - ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); - records.forEach(record -> { - UserEvent userEvent = record.value(); - System.out.println("User Event ID: " + userEvent.getUserEventId()); - }); - } - } -} - diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java deleted file mode 100644 index 9306abaebf..0000000000 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/SinglePartitionProducer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.kafka.message.ordering; - -import com.baeldung.kafka.message.ordering.payload.UserEvent; -import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.serialization.LongSerializer; - -import java.time.Instant; -import java.util.Properties; -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -public class SinglePartitionProducer { - public static void main(String[] args) throws ExecutionException, InterruptedException { - Properties props = new Properties(); - props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, Config.KAFKA_LOCAL); - props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); - props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - KafkaProducer producer = new KafkaProducer<>(props); - for (long count = 1; count <= 10; count++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); - userEvent.setEventNanoTime(System.nanoTime()); - Future future = producer.send(new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, count, userEvent)); - RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); - } - producer.close(); - System.out.println("SinglePartitionProducer Completed."); - } - -} diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index 5f540d5b50..0535e3c4e6 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -30,9 +30,7 @@ import static org.junit.jupiter.api.Assertions.*; @Testcontainers public class ExtSeqWithTimeWindowIntegrationTest { - private static String TOPIC = "multi_partition_topic"; - private static int PARTITIONS = 5; - private static short REPLICATION_FACTOR = 1; + private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; @@ -65,10 +63,10 @@ public class ExtSeqWithTimeWindowIntegrationTest { producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + NewTopic newTopic = new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR); topicList.add(newTopic); CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(TOPIC); + KafkaFuture future = result.values().get(Config.MULTI_PARTITION_TOPIC); future.whenComplete((voidResult, exception) -> { if (exception != null) { System.err.println("Error creating the topic: " + exception.getMessage()); @@ -91,14 +89,14 @@ public class ExtSeqWithTimeWindowIntegrationTest { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); userEvent.setGlobalSequenceNumber(sequenceNumber); - Future future = producer.send(new ProducerRecord<>(TOPIC, sequenceNumber, userEvent)); + Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("Partition : " + metadata.partition()); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } boolean isOrderMaintained = true; - consumer.subscribe(Collections.singletonList(TOPIC)); + consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); @@ -131,7 +129,7 @@ public class ExtSeqWithTimeWindowIntegrationTest { Collections.sort(buffer); buffer.forEach(userEvent -> { receivedUserEventList.add(userEvent); - System.out.println("Process message with Event ID: " + userEvent.getUserEventId()); + System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", User Event Id: " + userEvent.getUserEventId()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index d4b88ad06f..bbe9fcf7f8 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -30,9 +30,7 @@ import static org.junit.jupiter.api.Assertions.*; @Testcontainers public class MultiplePartitionIntegrationTest { - private static String TOPIC = "multi_partition_topic"; - private static int PARTITIONS = 5; - private static short REPLICATION_FACTOR = 1; + private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; @@ -63,10 +61,10 @@ public class MultiplePartitionIntegrationTest { producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + NewTopic newTopic = new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR); topicList.add(newTopic); CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(TOPIC); + KafkaFuture future = result.values().get(Config.MULTI_PARTITION_TOPIC); future.whenComplete((voidResult, exception) -> { if (exception != null) { System.err.println("Error creating the topic: " + exception.getMessage()); @@ -88,18 +86,19 @@ public class MultiplePartitionIntegrationTest { for (long count = 1; count <= 10 ; count++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); - Future future = producer.send(new ProducerRecord<>(TOPIC, count, userEvent)); + Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, count, userEvent)); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("Partition : " + metadata.partition()); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } boolean isOrderMaintained = true; - consumer.subscribe(Collections.singletonList(TOPIC)); + consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { UserEvent userEvent = record.value(); receivedUserEventList.add(userEvent); + System.out.println("User Event ID: " + userEvent.getUserEventId()); }); for (int insertPosition = 0; insertPosition <= receivedUserEventList.size() - 1; insertPosition++) { if (isOrderMaintained){ diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index b41dc67686..6894b0fe80 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -32,9 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @Testcontainers public class SinglePartitionIntegrationTest { - private static String TOPIC = "single_partition_topic"; - private static int PARTITIONS = 1; - private static short REPLICATION_FACTOR = 1; + private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; @@ -67,10 +65,10 @@ public class SinglePartitionIntegrationTest { producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(TOPIC, PARTITIONS, REPLICATION_FACTOR); + NewTopic newTopic = new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR); topicList.add(newTopic); CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(TOPIC); + KafkaFuture future = result.values().get(Config.SINGLE_PARTITION_TOPIC); future.whenComplete((voidResult, exception) -> { if (exception != null) { System.err.println("Error creating the topic: " + exception.getMessage()); @@ -92,18 +90,19 @@ public class SinglePartitionIntegrationTest { for (long count = 1; count <= 10 ; count++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); - ProducerRecord producerRecord = new ProducerRecord<>(TOPIC, userEvent); + ProducerRecord producerRecord = new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, userEvent); Future future = producer.send(producerRecord); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("Partition : " + metadata.partition()); + System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } - consumer.subscribe(Collections.singletonList(TOPIC)); + consumer.subscribe(Collections.singletonList(Config.SINGLE_PARTITION_TOPIC)); ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { UserEvent userEvent = record.value(); receivedUserEventList.add(userEvent); + System.out.println("User Event ID: " + userEvent.getUserEventId()); }); boolean result = true; for (int count = 0; count <= 9 ; count++) { From 667620821b143d5c750bb4869fceb939dbc60c47 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:41:15 -0400 Subject: [PATCH 338/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../message/ordering/ExtSeqWithTimeWindowIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index 0535e3c4e6..ab3e37916a 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -38,7 +38,7 @@ public class ExtSeqWithTimeWindowIntegrationTest { private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds @Container - private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5).toNanos(); @BeforeAll static void setup() throws ExecutionException, InterruptedException { From d0edfbc423a834b8ce6a6674cf54713a44ea4513 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:41:27 -0400 Subject: [PATCH 339/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../message/ordering/ExtSeqWithTimeWindowIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index ab3e37916a..af4aa53cc0 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -34,7 +34,7 @@ public class ExtSeqWithTimeWindowIntegrationTest { private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds @Container From 83d6d89db5287e00c9e563737e24b4d979a2d2d9 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:41:34 -0400 Subject: [PATCH 340/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/SinglePartitionIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 6894b0fe80..35b6602510 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -37,7 +37,7 @@ public class SinglePartitionIntegrationTest { private static KafkaProducer producer; private static KafkaConsumer consumer; - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); From bfa7c53b5463ad47c32dc595c234b2d6e5837da2 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:41:54 -0400 Subject: [PATCH 341/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../message/ordering/MultiplePartitionIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index bbe9fcf7f8..64a063c6c9 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -34,7 +34,7 @@ public class MultiplePartitionIntegrationTest { private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; - private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofMillis(5000); + private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); From 02e02f928f4ff4e4bad974b1e3e30e17b2fbc8ed Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Thu, 2 Nov 2023 17:47:02 -0600 Subject: [PATCH 342/831] [BAEL-7074] Synchronization for static data examples --- .../retry/RetryCompletableFuture.java | 2 +- .../threadpool/CustomCompletableFuture.java | 8 +- .../atomicinteger/Employee.java | 32 +++++++ .../synchronizestatic/none/Employee.java | 28 ++++++ .../reentrantlock/Employee.java | 44 +++++++++ .../synchronizedblock/Employee.java | 34 +++++++ .../synchronizedmethod/Employee.java | 27 ++++++ .../volatilekeyword/Employee.java | 29 ++++++ .../SychronizeStaticDataUnitTest.java | 89 +++++++++++++++++++ 9 files changed, 288 insertions(+), 5 deletions(-) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedmethod/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java index a3df6b3624..a46665559f 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java @@ -48,7 +48,7 @@ public class RetryCompletableFuture { CompletableFuture cf = CompletableFuture.supplyAsync(supplier); sleep(100); for (int i = 0; i < maxRetries; i++) { - cf = cf.exceptionallyAsync(__ -> supplier.get()); + //cf = cf.exceptionallyAsync(__ -> supplier.get()); } return cf; } diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java index 1f3997768e..473cc562ca 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java @@ -20,9 +20,9 @@ public class CustomCompletableFuture extends CompletableFuture { return future; } - @Override - public Executor defaultExecutor() { - return executor; - } +// @Override +// public Executor defaultExecutor() { +// return executor; +// } } \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java new file mode 100644 index 0000000000..845dd65ce6 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrent.synchronizestatic.atomicinteger; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Synchronizing static variable with AtomicInteger. + */ +public class Employee { + + private static final AtomicInteger count = new AtomicInteger(0); + + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + count.incrementAndGet(); + System.out.println("Count = " + count.get()); + } + + public static int getCount() { + return count.get(); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java new file mode 100644 index 0000000000..f050a68be4 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java @@ -0,0 +1,28 @@ +package com.baeldung.concurrent.synchronizestatic.none; + +/** + * No synchronization. + */ +public class Employee { + + static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + System.out.println("Count = " + ++count); + } + + public static Integer getCount() { + return count; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java new file mode 100644 index 0000000000..2ac0b0d3f2 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java @@ -0,0 +1,44 @@ +package com.baeldung.concurrent.synchronizestatic.reentrantlock; + +import java.util.concurrent.locks.ReentrantLock; + +/** + * Synchronizing static variable with a Reenatrant Lock. + */ +public class Employee { + + private static final ReentrantLock lock = new ReentrantLock(); + + static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + lock.lock(); + try { + System.out.println("Count = " + ++count); + } + finally { + lock.unlock(); + } + } + + public static int getCount() { + lock.lock(); + try { + return count; + } + finally { + lock.unlock(); + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java new file mode 100644 index 0000000000..9c078e7abe --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.synchronizestatic.synchronizedblock; + +/** + * Synchronizing static variable with a synchronized block. + */ +public class Employee { + + private static final Object lock = new Object(); + + static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + synchronized(lock) { + System.out.println("Count = " + ++count); + } + } + + public static int getCount() { + synchronized(lock) { + return count; + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedmethod/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedmethod/Employee.java new file mode 100644 index 0000000000..f0a785c427 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedmethod/Employee.java @@ -0,0 +1,27 @@ +package com.baeldung.concurrent.synchronizestatic.synchronizedmethod; + +/** + * Synchronizing static variable with a synchronized method. + */ +public class Employee { + static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static synchronized void incrementCount() { + System.out.println("Count = " + ++count); + } + + public static synchronized int getCount() { + return count; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java new file mode 100644 index 0000000000..f41b10e160 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java @@ -0,0 +1,29 @@ +package com.baeldung.concurrent.synchronizestatic.volatilekeyword; + +/** + * No synchronization. + */ +public class Employee +{ + + volatile static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + System.out.println("Count = " + ++count); + } + + public static Integer getCount() { + return count; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java new file mode 100644 index 0000000000..d8d9a344f1 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java @@ -0,0 +1,89 @@ +package com.baeldung.concurrent.synchronizestatic; + +import org.junit.Test; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +public class SychronizeStaticDataUnitTest +{ + private final Executor pool = Executors.newFixedThreadPool(4); + + @Test + public void whenNotSynchronized_thenDataOutOfOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.none.Employee(finalI, "John", "Smith"); + }); + } + } + + @Test + public void whenVolatile_thenDataInOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.volatilekeyword.Employee(finalI, "John", "Smith"); + }); + } + } + + @Test + public void whenSynchronizedMethod_thenDataInOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.synchronizedmethod.Employee(finalI, "John", "Smith"); + }); + } + } + + @Test + public void whenSynchronizedBlock_thenDataInOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.synchronizedblock.Employee(finalI, "John", "Smith"); + }); + } + } + + @Test + public void whenAtomicInteger_thenDataInOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.atomicinteger.Employee(finalI, "John", "Smith"); + }); + } + } + + @Test + public void whenReentrantLock_thenDataInOrder() { + int numberToTest = 100; + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.reentrantlock.Employee(finalI, "John", "Smith"); + }); + } + } +} From 1ab4017ad65984900919fa396e52a51637555a3b Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 19:47:05 -0400 Subject: [PATCH 343/831] Issue fixes --- .../ordering/ExtSeqWithTimeWindowIntegrationTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index af4aa53cc0..a18efe9961 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -35,11 +35,11 @@ public class ExtSeqWithTimeWindowIntegrationTest { private static KafkaProducer producer; private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); - - private static final long BUFFER_PERIOD_NS = 5000L * 1000000; // 5000 milliseconds converted to nanoseconds - @Container private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5).toNanos(); + @Container + private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); + @BeforeAll static void setup() throws ExecutionException, InterruptedException { KAFKA_CONTAINER.addExposedPort(9092); From 45bc3d94d407819a1d4c4e139c9b79b38e797e54 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Thu, 2 Nov 2023 20:18:19 -0400 Subject: [PATCH 344/831] Code Formatting --- .../ordering/SinglePartitionIntegrationTest.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 35b6602510..0c65618014 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -24,10 +24,12 @@ import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.DockerImageName; + import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import static org.junit.jupiter.api.Assertions.assertTrue; @Testcontainers @@ -53,6 +55,7 @@ public class SinglePartitionIntegrationTest { producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); + producer = new KafkaProducer<>(producerProperties); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); @@ -61,9 +64,10 @@ public class SinglePartitionIntegrationTest { consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - admin = Admin.create(adminProperties); - producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); + admin = Admin.create(adminProperties); + + List topicList = new ArrayList<>(); NewTopic newTopic = new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR); topicList.add(newTopic); @@ -87,7 +91,7 @@ public class SinglePartitionIntegrationTest { void givenASinglePartition_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); - for (long count = 1; count <= 10 ; count++) { + for (long count = 1; count <= 10; count++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); userEvent.setEventNanoTime(System.nanoTime()); ProducerRecord producerRecord = new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, userEvent); @@ -105,10 +109,10 @@ public class SinglePartitionIntegrationTest { System.out.println("User Event ID: " + userEvent.getUserEventId()); }); boolean result = true; - for (int count = 0; count <= 9 ; count++) { + for (int count = 0; count <= 9; count++) { UserEvent sentUserEvent = sentUserEventList.get(count); UserEvent receivedUserEvent = receivedUserEventList.get(count); - if (!sentUserEvent.equals(receivedUserEvent) && result){ + if (!sentUserEvent.equals(receivedUserEvent) && result) { result = false; } } From 38f30e733fc9ecf70a79a90c65f2ed82947d05b4 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Thu, 2 Nov 2023 19:23:43 -0600 Subject: [PATCH 345/831] [BAEL-7074] Update tests --- .../atomicinteger/Employee.java | 1 - .../volatilekeyword/Employee.java | 29 ------------ .../SychronizeStaticDataUnitTest.java | 45 ++++++++----------- 3 files changed, 19 insertions(+), 56 deletions(-) delete mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java index 845dd65ce6..9c3c9b987c 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java @@ -23,7 +23,6 @@ public class Employee { private static void incrementCount() { count.incrementAndGet(); - System.out.println("Count = " + count.get()); } public static int getCount() { diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java deleted file mode 100644 index f41b10e160..0000000000 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/volatilekeyword/Employee.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.concurrent.synchronizestatic.volatilekeyword; - -/** - * No synchronization. - */ -public class Employee -{ - - volatile static int count; - int id; - String name; - String title; - - public Employee(int id, String name, String title) - { - incrementCount(); - this.id = id; - this.name = name; - this.title = title; - } - - private static void incrementCount() { - System.out.println("Count = " + ++count); - } - - public static Integer getCount() { - return count; - } -} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java index d8d9a344f1..7e5dca9f2b 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java @@ -5,13 +5,22 @@ import org.junit.Test; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +/** + * The tests in this class show the output of creating multiple + * types of Employee classes in the synchronizedstatic + * package. When not synchronized the out will not be sequential; + * when it is synchronized the output will be in sequential. + */ public class SychronizeStaticDataUnitTest { private final Executor pool = Executors.newFixedThreadPool(4); + private final int numberToTest = 100; + @Test public void whenNotSynchronized_thenDataOutOfOrder() { - int numberToTest = 100; + + System.out.println("No synchronization"); for(int i = 0; i < numberToTest; i++) { int finalI = i; @@ -22,22 +31,10 @@ public class SychronizeStaticDataUnitTest } } - @Test - public void whenVolatile_thenDataInOrder() { - int numberToTest = 100; - - for(int i = 0; i < numberToTest; i++) { - int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.volatilekeyword.Employee(finalI, "John", "Smith"); - }); - } - } - @Test public void whenSynchronizedMethod_thenDataInOrder() { - int numberToTest = 100; + + System.out.println("Synchronization with synchronized method"); for(int i = 0; i < numberToTest; i++) { int finalI = i; @@ -50,7 +47,8 @@ public class SychronizeStaticDataUnitTest @Test public void whenSynchronizedBlock_thenDataInOrder() { - int numberToTest = 100; + + System.out.println("Synchronization with synchronized block"); for(int i = 0; i < numberToTest; i++) { int finalI = i; @@ -63,20 +61,15 @@ public class SychronizeStaticDataUnitTest @Test public void whenAtomicInteger_thenDataInOrder() { - int numberToTest = 100; - - for(int i = 0; i < numberToTest; i++) { - int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.atomicinteger.Employee(finalI, "John", "Smith"); - }); - } + // Not straight forward to test this because we cannot log/print + // and increment values in a synchronized fashion like other + // tests } @Test public void whenReentrantLock_thenDataInOrder() { - int numberToTest = 100; + + System.out.println("Synchronization with ReentrantLock"); for(int i = 0; i < numberToTest; i++) { int finalI = i; From 4c06d8e9f9e2a9ad53a1150ee5be4dd074d27fb4 Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Fri, 3 Nov 2023 05:15:06 +0100 Subject: [PATCH 346/831] How to Document Generic Type Parameter (#15108) * How to Documeny Generic Type Parameters * How to Documeny Generic Type Parameters --- .../java/com/baeldung/generictype/Pair.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 core-java-modules/core-java-documentation/src/main/java/com/baeldung/generictype/Pair.java diff --git a/core-java-modules/core-java-documentation/src/main/java/com/baeldung/generictype/Pair.java b/core-java-modules/core-java-documentation/src/main/java/com/baeldung/generictype/Pair.java new file mode 100644 index 0000000000..f85adcfdab --- /dev/null +++ b/core-java-modules/core-java-documentation/src/main/java/com/baeldung/generictype/Pair.java @@ -0,0 +1,23 @@ +package com.baeldung.generictype; + +/** + * @param The type of the first value in the {@code Pair}. + * @param The type of the second value in the {@code Pair}. + */ + +public class Pair { + public T first; + public S second; + + /** + * Constructs a new Pair object with the specified values. + * + * @param a The first value. + * @param b The second value. + */ + + public Pair(T a, S b) { + first = a; + second = b; + } +} From 6f618f5cf9b6a3e97ec7ced4802e9c4a556e9901 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Fri, 3 Nov 2023 01:20:47 -0300 Subject: [PATCH 347/831] BAEL-7128: Optional as a Record Parameter in Java (#15114) * record class and test * renaming test --- .../optionalsasparameterrecords/Product.java | 6 ++++++ .../OptionalAsRecordParameterUnitTest.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 core-java-modules/core-java-records/src/main/java/com/baeldung/optionalsasparameterrecords/Product.java create mode 100644 core-java-modules/core-java-records/src/test/java/com/baeldung/optionalsasparameterrecords/OptionalAsRecordParameterUnitTest.java diff --git a/core-java-modules/core-java-records/src/main/java/com/baeldung/optionalsasparameterrecords/Product.java b/core-java-modules/core-java-records/src/main/java/com/baeldung/optionalsasparameterrecords/Product.java new file mode 100644 index 0000000000..8ede001ee1 --- /dev/null +++ b/core-java-modules/core-java-records/src/main/java/com/baeldung/optionalsasparameterrecords/Product.java @@ -0,0 +1,6 @@ +package com.baeldung.optionalsasparameterrecords; + +import java.util.Optional; + +public record Product(String name, double price, Optional description) { +} diff --git a/core-java-modules/core-java-records/src/test/java/com/baeldung/optionalsasparameterrecords/OptionalAsRecordParameterUnitTest.java b/core-java-modules/core-java-records/src/test/java/com/baeldung/optionalsasparameterrecords/OptionalAsRecordParameterUnitTest.java new file mode 100644 index 0000000000..554fb2eac3 --- /dev/null +++ b/core-java-modules/core-java-records/src/test/java/com/baeldung/optionalsasparameterrecords/OptionalAsRecordParameterUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.optionalsasparameterrecords; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Optional; + +public class OptionalAsRecordParameterUnitTest { + + @Test + public void givenRecordCreationWithOptional_thenCreateItProperly() { + var emptyDescriptionProduct = new Product("television", 1699.99, Optional.empty()); + Assertions.assertEquals("television", emptyDescriptionProduct.name()); + Assertions.assertEquals(1699.99, emptyDescriptionProduct.price()); + Assertions.assertNull(emptyDescriptionProduct.description().orElse(null)); + } +} From b11ba779376bfd74ee8fdc73ba756597e5b76b59 Mon Sep 17 00:00:00 2001 From: Reza Ganji Date: Fri, 3 Nov 2023 07:57:27 +0330 Subject: [PATCH 348/831] BAEL-5970 Working with MathFlux (#15116) * Working with MathFlux. * revert change to readme. * merge codes in unit test. * merge codes in unit test. --------- Co-authored-by: rezaganjis --- reactor-core/pom.xml | 7 ++- .../math/MathFluxOperationsUnitTest.java | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 reactor-core/src/test/java/com/baeldung/reactor/math/MathFluxOperationsUnitTest.java diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml index e27a1a2845..dd7533fe73 100644 --- a/reactor-core/pom.xml +++ b/reactor-core/pom.xml @@ -26,6 +26,11 @@ ${reactor.version} test + + io.projectreactor.addons + reactor-extra + ${reactor.version} + org.projectlombok lombok @@ -35,7 +40,7 @@ - 3.4.17 + 3.5.1 \ No newline at end of file diff --git a/reactor-core/src/test/java/com/baeldung/reactor/math/MathFluxOperationsUnitTest.java b/reactor-core/src/test/java/com/baeldung/reactor/math/MathFluxOperationsUnitTest.java new file mode 100644 index 0000000000..2ff8005acd --- /dev/null +++ b/reactor-core/src/test/java/com/baeldung/reactor/math/MathFluxOperationsUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.math; + +import org.junit.Test; + +import reactor.math.MathFlux; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +public class MathFluxOperationsUnitTest { + + @Test + public void givenFluxOfNumbers_whenCalculatingSum_thenExpectCorrectResult() { + Flux numbers = Flux.just(1, 2, 3, 4, 5); + Mono sumMono = MathFlux.sumInt(numbers); + StepVerifier.create(sumMono) + .expectNext(15) + .verifyComplete(); + } + + @Test + public void givenFluxOfNumbers_whenCalculatingAverage_thenExpectCorrectResult() { + Flux numbers = Flux.just(1, 2, 3, 4, 5); + Mono averageMono = MathFlux.averageDouble(numbers); + StepVerifier.create(averageMono) + .expectNext(3.0) + .verifyComplete(); + } + + @Test + public void givenFluxOfNumbers_whenFindingMinElement_thenExpectCorrectResult() { + Flux numbers = Flux.just(3, 1, 5, 2, 4); + Mono minMono = MathFlux.min(numbers); + StepVerifier.create(minMono) + .expectNext(1) + .verifyComplete(); + } + + @Test + public void givenFluxOfNumbers_whenFindingMaxElement_thenExpectCorrectResult() { + Flux numbers = Flux.just(3, 1, 5, 2, 4); + Mono maxMono = MathFlux.max(numbers); + StepVerifier.create(maxMono) + .expectNext(5) + .verifyComplete(); + } + +} From 899700f27e7357cdb27653c0cb7be1a06323888d Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Fri, 3 Nov 2023 15:45:12 +0700 Subject: [PATCH 349/831] [Update] add time field --- .../UUIDPositiveLongGeneratorUnitTest.java | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index fab07df2a0..62b059f0e5 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -6,8 +6,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.Method; import java.text.DecimalFormat; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import static org.assertj.core.api.Assertions.assertThat; @@ -17,8 +16,11 @@ public class UUIDPositiveLongGeneratorUnitTest { private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); + List times = new ArrayList<>(); + @Test void whenForeachGenerateLongValue_thenCollisionsCheck() throws Exception { + times.clear(); printTableHeader(); for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { collisionCheck(method); @@ -26,16 +28,17 @@ public class UUIDPositiveLongGeneratorUnitTest { } private void printTableHeader() { - logger.info(String.format("%-30s %-15s %-15s", "Approach(method name)", "collisions", "probability")); - logger.info("-----------------------------------------------------------------------"); + logger.info(String.format("%-30s %15s %15s %15s", "Approach(method name)", "collisions", "probability","Time")); + logger.info("--------------------------------------------------------------------------------"); } - private void printOutput(String method, int collisionsCount, double collisionsProbability) { + private void printOutput(String method, int collisionsCount, double collisionsProbability, String time) { DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - logger.info(String.format("%-30s %-15s %-15s", method, collisionsCount, decimalFormat.format(collisionsProbability))); + logger.info(String.format("%-30s %15s %15s %15s", method, collisionsCount, decimalFormat.format(collisionsProbability),time)); } private void collisionCheck(Method method) throws Exception { + long start = System.currentTimeMillis(); Set uniqueValues = new HashSet<>(); int collisions = 0; for (int i = 0; i < NUMBER_OF_CHECKS; i++) { @@ -46,7 +49,34 @@ public class UUIDPositiveLongGeneratorUnitTest { } } double collisionsProbability = (double) collisions / NUMBER_OF_CHECKS; - printOutput(method.getName(), collisions, collisionsProbability); + long end = System.currentTimeMillis(); + String time = convertMillisToTime(end - start); + printOutput(method.getName(), collisions, collisionsProbability, time); assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); + + } + + private String convertMillisToTime(long currentTimeMillis) { + + long totalMilliseconds = currentTimeMillis % 1000; + times.add(totalMilliseconds); + long totalSeconds = (currentTimeMillis / 1000) % 60; + long totalMinutes = (currentTimeMillis / 60000) % 60; + long hours = (currentTimeMillis / 3600000); + StringJoiner stringBuffer = new StringJoiner(""); + + if (hours > 0){ + stringBuffer.add(hours+"h "); + } + if (totalMinutes > 0){ + stringBuffer.add(totalMinutes+" m "); + } + if (totalSeconds > 0){ + stringBuffer.add(totalSeconds+" s "); + } + if (totalMilliseconds > 0){ + stringBuffer.add(totalMilliseconds+" ms"); + } + return stringBuffer.toString(); } } From b7bc968da2a4f81850e2c7415e22ed0ccc4c6cd7 Mon Sep 17 00:00:00 2001 From: Hangga Aji Sayekti Date: Fri, 3 Nov 2023 17:13:48 +0700 Subject: [PATCH 350/831] Update core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java Oh yeah.. Co-authored-by: Liam Williams --- .../main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java index 7b98c05684..13b32be856 100644 --- a/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java +++ b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDPositiveLongGenerator.java @@ -16,7 +16,7 @@ public class UUIDPositiveLongGenerator { return Math.abs(UUID.randomUUID().getMostSignificantBits()); } - public long gethashCode() { + public long getHashCode() { return Math.abs(UUID.randomUUID().toString().hashCode()); } From 26a57c08ee02d090edb77376d69f7bf0258646f3 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Fri, 3 Nov 2023 13:21:09 +0100 Subject: [PATCH 351/831] JAVA-22296 | Upgrade spring-cloud-modules to JDK 17: Chunk 4 (#15020) --- .../spring-cloud-contract-consumer/pom.xml | 11 +++++ .../BasicMathControllerIntegrationTest.java | 48 ++++--------------- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml index a8c3337de5..234f8b1b60 100644 --- a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml +++ b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml @@ -16,10 +16,12 @@ + org.springframework.boot spring-boot-starter-web + org.springframework.boot spring-boot-starter-data-rest @@ -30,16 +32,25 @@ spring-cloud-contract-wiremock test + org.springframework.cloud spring-cloud-contract-stub-runner test + com.baeldung.spring.cloud spring-cloud-contract-producer ${project.parent.version} + stubs test + + + * + * + + diff --git a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java index c19b3f3694..c7d8b695db 100644 --- a/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java @@ -1,24 +1,18 @@ package com.baeldung.spring.cloud.springcloudcontractconsumer.controller; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; -import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties; +import org.springframework.cloud.contract.stubrunner.junit.StubRunnerRule; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -26,42 +20,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) @AutoConfigureMockMvc @AutoConfigureJsonTesters -@AutoConfigureStubRunner(stubsMode = StubRunnerProperties.StubsMode.LOCAL, - ids = "com.baeldung.spring.cloud:spring-cloud-contract-producer:+:stubs:8090") public class BasicMathControllerIntegrationTest { + @Rule + public StubRunnerRule rule = new StubRunnerRule().downloadStub( + "com.baeldung.spring.cloud", + "spring-cloud-contract-producer") + .withPort(8090).failOnNoStubs(true); + @Autowired private MockMvc mockMvc; - private static WireMockServer wireMockServer; - - - @BeforeClass - public static void setupClass() { - WireMockConfiguration wireMockConfiguration = WireMockConfiguration.options().port(8090); // Use the same port as in your code - - wireMockServer = new WireMockServer(wireMockConfiguration); - wireMockServer.start(); - } - - @AfterClass - public static void teardownClass() { - wireMockServer.stop(); - } - - @Before - public void setup() { - wireMockServer.stubFor(get(urlEqualTo("/validate/prime-number?number=1")) - .willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody("Odd"))); - - wireMockServer.stubFor(get(urlEqualTo("/validate/prime-number?number=2")) - .willReturn(aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/json") - .withBody("Even"))); - } @Test public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven() throws Exception { From 3d561e24df46720097f8f2e1eeaea780c18d102d Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Fri, 3 Nov 2023 12:43:44 +0000 Subject: [PATCH 352/831] BAEL-7105 Add code for StringBuilder comparison --- .../core-java-string-apis-2/pom.xml | 10 +++++ .../StringBuilderCompare.java | 17 ++++++++ .../StringBuilderComparisonUnitTest.java | 43 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 core-java-modules/core-java-string-apis-2/src/main/java/stringbuildercomparison/StringBuilderCompare.java create mode 100644 core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringbuildercomparison/StringBuilderComparisonUnitTest.java diff --git a/core-java-modules/core-java-string-apis-2/pom.xml b/core-java-modules/core-java-string-apis-2/pom.xml index 814d301532..0289a18e85 100644 --- a/core-java-modules/core-java-string-apis-2/pom.xml +++ b/core-java-modules/core-java-string-apis-2/pom.xml @@ -33,6 +33,16 @@ core-java-string-apis-2 + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + src/main/resources diff --git a/core-java-modules/core-java-string-apis-2/src/main/java/stringbuildercomparison/StringBuilderCompare.java b/core-java-modules/core-java-string-apis-2/src/main/java/stringbuildercomparison/StringBuilderCompare.java new file mode 100644 index 0000000000..2d2dc04b83 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/main/java/stringbuildercomparison/StringBuilderCompare.java @@ -0,0 +1,17 @@ +package stringbuildercomparison; + +public class StringBuilderCompare { + + public static boolean compare(StringBuilder one, StringBuilder two){ + if(one.length() != two.length()){ + return false; + } + for(int i = 0; i < one.length(); i++){ + if(one.charAt(i) != two.charAt(i)){ + return false; + } + } + return true; + } + +} diff --git a/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringbuildercomparison/StringBuilderComparisonUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringbuildercomparison/StringBuilderComparisonUnitTest.java new file mode 100644 index 0000000000..b1a5a83770 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/stringbuildercomparison/StringBuilderComparisonUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.stringbuildercomparison; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotSame; + +import org.junit.Test; + +import stringbuildercomparison.StringBuilderCompare; + +public class StringBuilderComparisonUnitTest { + + @Test + public void whenUsingJavaEight_givenTwoIdenticalStringBuilders_thenCorrectlyMatch(){ + StringBuilder one = new StringBuilder("Hello"); + StringBuilder two = new StringBuilder("Hello"); + boolean result = StringBuilderCompare.compare(one, two); + assertEquals(true, result); + } + + @Test + public void whenUsingJavaEight_givenTwoDifferentStringBuilders_thenCorrectlyIdentifyDifference(){ + StringBuilder one = new StringBuilder("Hello"); + StringBuilder two = new StringBuilder("World"); + boolean result = StringBuilderCompare.compare(one, two); + assertEquals(false, result); + } + + @Test + public void whenUsingJavaEleven_givenTwoIdenticalStringBuilders_thenCorrectlyMatch(){ + StringBuilder one = new StringBuilder("Hello"); + StringBuilder two = new StringBuilder("Hello"); + assertEquals(0, one.compareTo(two)); + } + + @Test + public void whenUsingJavaEleven_givenTwoDifferentStringBuilders_thenCorrectlyIdentifyDifference(){ + StringBuilder one = new StringBuilder("Hello"); + StringBuilder two = new StringBuilder("World"); + assertNotSame(0, one.compareTo(two)); + } + + +} From 1aa2f849f49c5f14c25e07966e199593ca449e80 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 3 Nov 2023 13:10:24 -0600 Subject: [PATCH 353/831] Revert 2 changes unrelated to BAEL-7074 --- .../completablefuture/retry/RetryCompletableFuture.java | 2 +- .../threadpool/CustomCompletableFuture.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java index a46665559f..a3df6b3624 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/retry/RetryCompletableFuture.java @@ -48,7 +48,7 @@ public class RetryCompletableFuture { CompletableFuture cf = CompletableFuture.supplyAsync(supplier); sleep(100); for (int i = 0; i < maxRetries; i++) { - //cf = cf.exceptionallyAsync(__ -> supplier.get()); + cf = cf.exceptionallyAsync(__ -> supplier.get()); } return cf; } diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java index 473cc562ca..1f3997768e 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/completablefuture/threadpool/CustomCompletableFuture.java @@ -20,9 +20,9 @@ public class CustomCompletableFuture extends CompletableFuture { return future; } -// @Override -// public Executor defaultExecutor() { -// return executor; -// } + @Override + public Executor defaultExecutor() { + return executor; + } } \ No newline at end of file From 159461815d99562f7d8f1babe787c7f784145a92 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 3 Nov 2023 15:31:25 -0600 Subject: [PATCH 354/831] New example and unit test --- .../synchronizedclass/Employee.java | 32 +++++++++++++++++++ .../SychronizeStaticDataUnitTest.java | 16 +++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java new file mode 100644 index 0000000000..a69b633f3b --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrent.synchronizestatic.synchronizedclass; + +/** + * Synchronizing static variable with a synchronized block. + */ +public class Employee +{ + static int count; + int id; + String name; + String title; + + public Employee(int id, String name, String title) + { + incrementCount(); + this.id = id; + this.name = name; + this.title = title; + } + + private static void incrementCount() { + synchronized(Employee.class) { + System.out.println("Count = " + ++count); + } + } + + public static int getCount() { + synchronized(Employee.class) { + return count; + } + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java index 7e5dca9f2b..e633005c6f 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java @@ -45,10 +45,24 @@ public class SychronizeStaticDataUnitTest } } + @Test + public void whenSynchronizedClass_thenDataInOrder() { + + System.out.println("Synchronization with synchronized block on class"); + + for(int i = 0; i < numberToTest; i++) { + int finalI = i; + pool.execute(() -> + { + new com.baeldung.concurrent.synchronizestatic.synchronizedclass.Employee(finalI, "John", "Smith"); + }); + } + } + @Test public void whenSynchronizedBlock_thenDataInOrder() { - System.out.println("Synchronization with synchronized block"); + System.out.println("Synchronization with synchronized block on a private object"); for(int i = 0; i < numberToTest; i++) { int finalI = i; From 0f6149ef8cbbd7b60312b2726f7501dcdd85dc13 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Fri, 3 Nov 2023 23:31:49 +0200 Subject: [PATCH 355/831] [JAVA-26735] Upgraded gson library to 2.10.1 version --- aws-modules/aws-dynamodb/pom.xml | 2 +- aws-modules/aws-miscellaneous/pom.xml | 2 +- java-websocket/pom.xml | 2 +- json-modules/gson/pom.xml | 2 +- .../JsonObjectConversionsUnitTest.java | 31 ++++++++++++------- json-modules/json-arrays/pom.xml | 2 +- json-modules/json/pom.xml | 2 +- libraries-data-io/pom.xml | 2 +- libraries-data/pom.xml | 2 +- libraries-http-2/pom.xml | 2 +- libraries-http/pom.xml | 2 +- web-modules/javax-servlets/pom.xml | 2 +- web-modules/spark-java/pom.xml | 2 +- 13 files changed, 31 insertions(+), 24 deletions(-) diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml index 37b88327f4..adce036733 100644 --- a/aws-modules/aws-dynamodb/pom.xml +++ b/aws-modules/aws-dynamodb/pom.xml @@ -79,7 +79,7 @@ - 2.8.0 + 2.10.1 1.21.1 3.1.1 diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index 4126256fb9..5fdd7fa04d 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -73,7 +73,7 @@ - 2.8.0 + 2.10.1 1.21.1 1.10.L001 0.9.4.0006L diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml index d529b32022..fd97fd9db3 100644 --- a/java-websocket/pom.xml +++ b/java-websocket/pom.xml @@ -29,7 +29,7 @@ 1.1 - 2.8.0 + 2.10.1 \ No newline at end of file diff --git a/json-modules/gson/pom.xml b/json-modules/gson/pom.xml index ecfbaa7be4..ba968d9ae1 100644 --- a/json-modules/gson/pom.xml +++ b/json-modules/gson/pom.xml @@ -64,7 +64,7 @@ - 2.8.0 + 2.10.1 2.9.6 diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java index 9f07617969..18d9ccaf06 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java @@ -1,7 +1,9 @@ package com.baeldung.gson.conversion; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import com.google.gson.*; -import org.junit.Assert; import org.junit.jupiter.api.Test; public class JsonObjectConversionsUnitTest { @@ -10,24 +12,29 @@ public class JsonObjectConversionsUnitTest { void whenUsingJsonParser_thenConvertToJsonObject() throws Exception { // Example 1: Using JsonParser String json = "{ \"name\": \"Baeldung\", \"java\": true }"; - - JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject(); - - Assert.assertTrue(jsonObject.isJsonObject()); - Assert.assertTrue(jsonObject.get("name").getAsString().equals("Baeldung")); - Assert.assertTrue(jsonObject.get("java").getAsBoolean() == true); + + JsonObject jsonObject = JsonParser.parseString(json) + .getAsJsonObject(); + + assertTrue(jsonObject.isJsonObject()); + assertEquals("Baeldung", jsonObject.get("name") + .getAsString()); + assertTrue(jsonObject.get("java") + .getAsBoolean()); } @Test void whenUsingGsonInstanceFromJson_thenConvertToJsonObject() throws Exception { // Example 2: Using fromJson String json = "{ \"name\": \"Baeldung\", \"java\": true }"; - + JsonObject convertedObject = new Gson().fromJson(json, JsonObject.class); - - Assert.assertTrue(convertedObject.isJsonObject()); - Assert.assertTrue(convertedObject.get("name").getAsString().equals("Baeldung")); - Assert.assertTrue(convertedObject.get("java").getAsBoolean() == true); + + assertTrue(convertedObject.isJsonObject()); + assertEquals("Baeldung", convertedObject.get("name") + .getAsString()); + assertTrue(convertedObject.get("java") + .getAsBoolean()); } } diff --git a/json-modules/json-arrays/pom.xml b/json-modules/json-arrays/pom.xml index 10c487fbda..ec492b49cc 100644 --- a/json-modules/json-arrays/pom.xml +++ b/json-modules/json-arrays/pom.xml @@ -38,7 +38,7 @@ 1.0 - 2.8.5 + 2.10.1 1.1.2 2.28.0 diff --git a/json-modules/json/pom.xml b/json-modules/json/pom.xml index 27c9262279..ba075be679 100644 --- a/json-modules/json/pom.xml +++ b/json-modules/json/pom.xml @@ -68,7 +68,7 @@ 1.0.72 1.0 1.0.1 - 2.8.5 + 2.10.1 1.1.2 2.28.0 diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml index 2e126610d4..0a8afa02e2 100644 --- a/libraries-data-io/pom.xml +++ b/libraries-data-io/pom.xml @@ -106,7 +106,7 @@ v4-rev493-1.21.0 6.1.2 2.3.1 - 2.8.7 + 2.10.1 1.15 0.14.2 3.17.3 diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index a721e967d2..85ef01e704 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -210,7 +210,7 @@ 3.3.1 2.14.0 2.9.1 - 2.9.1 + 2.10.1 1.1.1 1.5.0 5.2.0 diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index fa3b6534db..c80c5729a7 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -110,7 +110,7 @@ 4.9.1 - 2.8.5 + 2.10.1 4.9.1 1.0.3 9.4.19.v20190610 diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml index 18ba571f60..c726b56b5d 100644 --- a/libraries-http/pom.xml +++ b/libraries-http/pom.xml @@ -103,7 +103,7 @@ - 2.8.5 + 2.10.1 4.5.3 4.9.1 1.23.0 diff --git a/web-modules/javax-servlets/pom.xml b/web-modules/javax-servlets/pom.xml index 80a1e3af9f..406cfc05c1 100644 --- a/web-modules/javax-servlets/pom.xml +++ b/web-modules/javax-servlets/pom.xml @@ -49,7 +49,7 @@ 4.5.3 - 2.8.2 + 2.10.1 \ No newline at end of file diff --git a/web-modules/spark-java/pom.xml b/web-modules/spark-java/pom.xml index da09467212..e49be68319 100644 --- a/web-modules/spark-java/pom.xml +++ b/web-modules/spark-java/pom.xml @@ -30,7 +30,7 @@ 2.5.4 - 2.8.0 + 2.10.1 \ No newline at end of file From a324fc5c33993d3721f210c9e9079fb3233b4161 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Fri, 3 Nov 2023 23:52:59 +0200 Subject: [PATCH 356/831] [JAVA-26735] Replaced deprecated API JsonParser --- .../JsonObjectConversionsUnitTest.java | 2 ++ .../test/GsonDeserializationUnitTest.java | 8 ++--- .../gson/jsoncompare/JsonCompareUnitTest.java | 34 +++++++------------ .../serialization/GsonSerializeUnitTest.java | 3 +- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java index 18d9ccaf06..e1e5e48269 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/conversion/JsonObjectConversionsUnitTest.java @@ -4,6 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import com.google.gson.*; + +import org.junit.Assert; import org.junit.jupiter.api.Test; public class JsonObjectConversionsUnitTest { diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java index adc046ed8e..81d59cf364 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java @@ -3,8 +3,9 @@ package com.baeldung.gson.deserialization.test; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.not; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; + import java.lang.reflect.Type; import java.util.ArrayList; @@ -68,7 +69,7 @@ public class GsonDeserializationUnitTest { final GenericFoo targetObject = new Gson().fromJson(json, typeToken); - assertEquals(targetObject.theValue, new Integer(1)); + assertEquals(targetObject.theValue, Integer.valueOf(1)); } // tests - multiple elements @@ -98,8 +99,7 @@ public class GsonDeserializationUnitTest { @Test public void whenDeserializingJsonIntoElements_thenCorrect() { final String jsonSourceObject = "{\"valueInt\":7,\"valueString\":\"seven\"}"; - final JsonParser jParser = new JsonParser(); - final JsonElement jElement = jParser.parse(jsonSourceObject); + final JsonElement jElement = JsonParser.parseString(jsonSourceObject); final JsonObject jObject = jElement.getAsJsonObject(); final int intValue = jObject.get("valueInt").getAsInt(); final String stringValue = jObject.get("valueString").getAsString(); diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/jsoncompare/JsonCompareUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/jsoncompare/JsonCompareUnitTest.java index 84989a7411..4235eb426a 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/jsoncompare/JsonCompareUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/jsoncompare/JsonCompareUnitTest.java @@ -16,79 +16,71 @@ public class JsonCompareUnitTest { @Test public void givenIdenticalSimpleObjects_whenCompared_thenEqual() { - JsonParser parser = new JsonParser(); String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27 }}"; String string2 = "{\"customer\": {\"id\": \"44521\", \"fullName\": \"Emily Jenkins\",\"age\": 27}}"; - assertTrue(parser.parse(string1) - .isJsonObject()); - assertEquals(parser.parse(string1), parser.parse(string2)); + assertTrue(JsonParser.parseString(string1).isJsonObject()); + assertEquals(JsonParser.parseString(string1), JsonParser.parseString(string2)); } @Test public void givenSameObjectsInDifferentOrder_whenCompared_thenEqual() { - JsonParser parser = new JsonParser(); String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27 }}"; String string2 = "{\"customer\": {\"id\": \"44521\",\"age\": 27, \"fullName\": \"Emily Jenkins\" }}"; - JsonElement json1 = parser.parse(string1); - JsonElement json2 = parser.parse(string2); + JsonElement json1 = JsonParser.parseString(string1); + JsonElement json2 = JsonParser.parseString(string2); assertEquals(json1, json2); } @Test public void givenIdenticalArrays_whenCompared_thenEqual() { - JsonParser parser = new JsonParser(); String string1 = "[10, 20, 30]"; String string2 = "[10, 20, 30]"; - assertTrue(parser.parse(string1) + assertTrue(JsonParser.parseString(string1) .isJsonArray()); - assertEquals(parser.parse(string1), parser.parse(string2)); + assertEquals(JsonParser.parseString(string1), JsonParser.parseString(string2)); } @Test public void givenArraysInDifferentOrder_whenCompared_thenNotEqual() { - JsonParser parser = new JsonParser(); String string1 = "[20, 10, 30]"; String string2 = "[10, 20, 30]"; - assertNotEquals(parser.parse(string1), parser.parse(string2)); + assertNotEquals(JsonParser.parseString(string1), JsonParser.parseString(string2)); } @Test public void givenIdenticalNestedObjects_whenCompared_thenEqual() { - JsonParser parser = new JsonParser(); String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"fav_product\": \"Coke\", \"last_buy\": \"2012-04-23\"}}}"; String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"fav_product\": \"Coke\"}}}"; - JsonElement json1 = parser.parse(string1); - JsonElement json2 = parser.parse(string2); + JsonElement json1 = JsonParser.parseString(string1); + JsonElement json2 = JsonParser.parseString(string2); assertEquals(json1, json2); } @Test public void givenIdenticalNestedObjectsWithArray_whenCompared_thenEqual() { - JsonParser parser = new JsonParser(); String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}"; String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}"; - JsonElement json1 = parser.parse(string1); - JsonElement json2 = parser.parse(string2); + JsonElement json1 = JsonParser.parseString(string1); + JsonElement json2 = JsonParser.parseString(string2); assertEquals(json1, json2); } @Test public void givenNestedObjectsDifferentArrayOrder_whenCompared_thenNotEqual() { - JsonParser parser = new JsonParser(); String string1 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"banana\", \"eggs\"]}}}"; String string2 = "{\"customer\": {\"id\": \"44521\",\"fullName\": \"Emily Jenkins\", \"age\": 27, \"consumption_info\" : {\"last_buy\": \"2012-04-23\", \"prouducts\": [\"eggs\", \"banana\"]}}}"; - JsonElement json1 = parser.parse(string1); - JsonElement json2 = parser.parse(string2); + JsonElement json1 = JsonParser.parseString(string1); + JsonElement json2 = JsonParser.parseString(string2); assertNotEquals(json1, json2); } diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/serialization/GsonSerializeUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/serialization/GsonSerializeUnitTest.java index 21d2bedd24..0d54cffbb4 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/serialization/GsonSerializeUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/serialization/GsonSerializeUnitTest.java @@ -41,8 +41,7 @@ public class GsonSerializeUnitTest { .serializeNulls() .disableHtmlEscaping() .create() - .toJson(new JsonParser() - .parse("{\"imdbId\":null,\"actors\":[{\"IMDB Code\":\"nm2199632\",\"Date Of Birth\":\"21-09-1982\",\"N° Film: \":3,\"filmography\":\"Apocalypto-Beatdown-Wind Walkers\"}]}")); + .toJson(JsonParser.parseString("{\"imdbId\":null,\"actors\":[{\"IMDB Code\":\"nm2199632\",\"Date Of Birth\":\"21-09-1982\",\"N° Film: \":3,\"filmography\":\"Apocalypto-Beatdown-Wind Walkers\"}]}")); Assert.assertEquals(gson.toJson(movieWithNullValue), expectedOutput); } } From 22ad2b88a8d02dd92316f159e4d31656a4aa922b Mon Sep 17 00:00:00 2001 From: vaibhav007jain <72961247+vaibhav007jain@users.noreply.github.com> Date: Sat, 4 Nov 2023 11:02:23 +0530 Subject: [PATCH 357/831] Bael-7075: Initial Commit (#15053) * Create VectorOperations.java BAEL-7075: Initial Commit * BAEL-7075: Create VectorOperationsUnitTest.java * Delete core-java-modules/core-java-collections-5/src/main/java/com/baeldung/vectors/VectorOperations.java * Update VectorOperationsUnitTest.java * Update VectorOperationsUnitTest.java - Added one more test case --- .../vectors/VectorOperationsUnitTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/src/test/java/com/baeldung/vectors/VectorOperationsUnitTest.java diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/vectors/VectorOperationsUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/vectors/VectorOperationsUnitTest.java new file mode 100644 index 0000000000..c948ce2481 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/vectors/VectorOperationsUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.vectors; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Vector; + +import org.junit.Test; + +public class VectorOperationsUnitTest { + + private static Vector getVector() { + Vector vector = new Vector(); + vector.add("Today"); + vector.add("is"); + vector.add("a"); + vector.add("great"); + vector.add("day!"); + + return vector; + } + + @Test + public void givenAVector_whenAddElementsUsingAddMethod_thenElementsGetAddedAtEnd() { + Vector vector = getVector(); + vector.add("Hello"); + assertEquals(6, vector.size()); + } + + @Test + public void givenAVector_whenUpdateElementAtIndex_thenElementAtIndexGetsUpdated() { + Vector vector = getVector(); + assertEquals(5, vector.size()); + assertEquals("great", vector.get(3)); + vector.set(3, "good"); + assertEquals("good", vector.get(3)); + } + + @Test + public void givenAVector_whenRemoveAnElement_thenElementGetsRemovedFromTheVector() { + Vector vector = getVector(); + assertEquals(5, vector.size()); + + // remove a specific element + vector.remove("a"); + assertEquals(4, vector.size()); + + // remove at specific index + vector.remove(2); + assertEquals("day!", vector.get(2)); + assertEquals(3, vector.size()); + + assertEquals(false, vector.remove("SomethingThatDoesn'tExist")); + } + + @Test(expected = ArrayIndexOutOfBoundsException.class) + public void givenAVector_whenIndexIsBeyondRange_thenRemoveMethodThrowsArrayIndexOutOfBoundsException() { + Vector vector = getVector(); + assertEquals(5, vector.size()); + vector.remove(10); + } + + @Test + public void givenAVector_whenGetElementWithinARange_thenGetMethodGetsAnElementFromTheVector() { + Vector vector = getVector(); + String fourthElement = vector.get(3); + assertEquals("great", fourthElement); + } + + @Test(expected = ArrayIndexOutOfBoundsException.class) + public void givenAVector_whenGetElementBeyondARange_thenGetMethodThrowsArrayIndexOutOfBoundsException() { + Vector vector = getVector(); + assertEquals(5, vector.size()); + vector.get(10); + } + + @Test + public void givenAVector_whenAddElementFromACollection_thenAllElementsGetAdeddToTheVector() { + Vector vector = getVector(); + assertEquals(5, vector.size()); + ArrayList words = new ArrayList<>(Arrays.asList("Baeldung", "is", "cool!")); + vector.addAll(words); + assertEquals(8, vector.size()); + assertEquals("cool!", vector.get(7)); + } +} From 049770733ccef4e7e364c2cd6768f66b66e85e77 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 4 Nov 2023 12:24:35 +0530 Subject: [PATCH 358/831] JAVA-27176 Upgrade hibernate validator version in core-java-string-operations-2 module --- .../core-java-string-operations-2/pom.xml | 22 +++++-------------- .../SomeClassWithValidations.java | 2 +- .../emptystrings/EmptyStringsUnitTest.java | 8 +++---- 3 files changed, 10 insertions(+), 22 deletions(-) diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index 902e8f09b4..383a3b4a40 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -14,11 +14,6 @@ - - javax.validation - validation-api - ${validation-api.version} - org.apache.commons commons-lang3 @@ -30,14 +25,9 @@ ${hibernate-validator.version} - javax.el - javax.el-api - ${javax.el-api.version} - - - org.glassfish.web - javax.el - ${javax.el.version} + org.glassfish.expressly + expressly + ${expressly.version} org.openjdk.jmh @@ -95,10 +85,8 @@ - 2.0.0.Final - 6.0.2.Final - 3.0.0 - 2.2.6 + 8.0.1.Final + 5.0.0 1.14 5.3.0 diff --git a/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/emptystrings/SomeClassWithValidations.java b/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/emptystrings/SomeClassWithValidations.java index 058d53ba82..abe311938a 100644 --- a/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/emptystrings/SomeClassWithValidations.java +++ b/core-java-modules/core-java-string-operations-2/src/main/java/com/baeldung/emptystrings/SomeClassWithValidations.java @@ -1,6 +1,6 @@ package com.baeldung.emptystrings; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; class SomeClassWithValidations { diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java index 9652e0e770..c756953c70 100644 --- a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java +++ b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/emptystrings/EmptyStringsUnitTest.java @@ -5,10 +5,10 @@ import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.springframework.util.ObjectUtils; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import java.util.Set; import static org.hamcrest.Matchers.iterableWithSize; From 674f03a8fe8eee695e78aac18fe9cbe472f466e9 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 4 Nov 2023 12:43:56 +0530 Subject: [PATCH 359/831] JAVA-27177 Upgrade hibernate-validator version in atomikos module --- atomikos/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atomikos/pom.xml b/atomikos/pom.xml index cd798825d1..d2ef7c84b2 100644 --- a/atomikos/pom.xml +++ b/atomikos/pom.xml @@ -114,7 +114,7 @@ 1.1 1.0 2.0.1.Final - 6.1.2.Final + 8.0.1.Final 3.0.0 2.2.4 From 20361bec8ebc4b3f059b2ce9a98e2433e9622781 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 4 Nov 2023 12:59:59 +0530 Subject: [PATCH 360/831] JAVA-27178 Upgrade hibernate-validator in javaxval module --- javaxval/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javaxval/pom.xml b/javaxval/pom.xml index bececb2ea7..c4a30f915d 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -37,7 +37,7 @@ - 6.2.0.Final + 8.0.1.Final 3.0.4 From 885111ea75a8e4edb6b5fd82e94389effc8232ae Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 4 Nov 2023 13:13:28 +0530 Subject: [PATCH 361/831] JAVA-27177 Upragde hibernate validator- Remove dependencies no longer needed --- atomikos/pom.xml | 18 ------------------ .../atomikos/spring/jpa/Application.java | 8 ++++---- .../atomikos/spring/jpa/order/Order.java | 2 +- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/atomikos/pom.xml b/atomikos/pom.xml index d2ef7c84b2..2cbc106268 100644 --- a/atomikos/pom.xml +++ b/atomikos/pom.xml @@ -82,26 +82,11 @@ geronimo-jta_1.0.1B_spec ${geronimo.version} - - javax.validation - validation-api - ${validation-api.version} - org.hibernate.validator hibernate-validator ${hibernate-validator.version} - - javax.el - javax.el-api - ${javax.el-api.version} - - - org.glassfish.web - javax.el - ${javax.el.version} - @@ -113,10 +98,7 @@ 10.8.1.2 1.1 1.0 - 2.0.1.Final 8.0.1.Final - 3.0.0 - 2.2.4 \ No newline at end of file diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java index cf1fef2cd8..ad828bd2ca 100644 --- a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java @@ -3,10 +3,10 @@ package com.baeldung.atomikos.spring.jpa; import java.util.Set; import java.util.UUID; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java index 4b9ae2dd1d..3a580e6448 100644 --- a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java +++ b/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java @@ -3,7 +3,7 @@ package com.baeldung.atomikos.spring.jpa.order; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; -import javax.validation.constraints.Max; +import jakarta.validation.constraints.Max; @Entity @Table(name = "ORDERS") From 32940c41e4a6f0db1a29e2093f7c79ae83e7e2d9 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Sat, 4 Nov 2023 15:28:49 +0700 Subject: [PATCH 362/831] update time test --- .../com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 62b059f0e5..70b47df163 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -28,13 +28,13 @@ public class UUIDPositiveLongGeneratorUnitTest { } private void printTableHeader() { - logger.info(String.format("%-30s %15s %15s %15s", "Approach(method name)", "collisions", "probability","Time")); + logger.info(String.format("%-25s %15s %15s %15s", "Approach(method name)", "collisions", "probability","Testing Time")); logger.info("--------------------------------------------------------------------------------"); } private void printOutput(String method, int collisionsCount, double collisionsProbability, String time) { DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - logger.info(String.format("%-30s %15s %15s %15s", method, collisionsCount, decimalFormat.format(collisionsProbability),time)); + logger.info(String.format("%-25s %15s %15s %15s", method, collisionsCount, decimalFormat.format(collisionsProbability),time)); } private void collisionCheck(Method method) throws Exception { From 36a30dcda86fd7417c0c6ad90d733e131da3d52c Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 4 Nov 2023 09:41:18 +0100 Subject: [PATCH 363/831] JAVA-13263 | Moved some gradle7 and gradle8 modules. (#15046) --- gradle-modules/gradle-7/README.md | 3 +- .../conditional-dependency-demo/.gitignore | 2 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../conditional-dependency-demo/gradlew | 234 ----------------- .../conditional-dependency-demo/gradlew.bat | 89 ------- .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../gradle-7/gradle-javadoc/gradlew | 240 ----------------- .../gradle-7/gradle-javadoc/gradlew.bat | 91 ------- .../gradle-7/gradle-wsdl-stubs/build.gradle | 5 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../gradle-7/gradle-wsdl-stubs/gradlew | 244 ------------------ .../gradle-7/gradle-wsdl-stubs/gradlew.bat | 92 ------- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../gradle-7/{toolchains-feature => }/gradlew | 22 +- .../{dependency-version => }/gradlew.bat | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../multiple-repositories/gradlew | 234 ----------------- .../multiple-repositories/gradlew.bat | 89 ------- .../gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../publish-package/gradlew | 234 ----------------- .../publish-package/gradlew.bat | 89 ------- .../settings.gradle | 4 + gradle-modules/gradle-7/settings.gradle | 7 + gradle-modules/gradle-8/README.md | 4 + .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../dependency-version => gradle-8}/gradlew | 29 ++- .../gradlew.bat | 0 gradle-modules/gradle-8/settings.gradle | 3 + .../toolchains-feature/.gitattributes | 0 .../toolchains-feature/.gitignore | 0 .../toolchains-feature/build.gradle | 0 .../toolchains-feature/settings.gradle | 0 .../gradle-protobuf/gradlew | 0 gradle-modules/settings.gradle | 2 + 39 files changed, 58 insertions(+), 1691 deletions(-) delete mode 100644 gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradle-modules/gradle-7/conditional-dependency-demo/gradlew delete mode 100644 gradle-modules/gradle-7/conditional-dependency-demo/gradlew.bat delete mode 100644 gradle-modules/gradle-7/gradle-javadoc/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle-7/gradle-javadoc/gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradle-modules/gradle-7/gradle-javadoc/gradlew delete mode 100644 gradle-modules/gradle-7/gradle-javadoc/gradlew.bat delete mode 100644 gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew delete mode 100644 gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew.bat rename gradle-modules/gradle-7/{toolchains-feature => }/gradle/wrapper/gradle-wrapper.properties (82%) rename gradle-modules/gradle-7/{toolchains-feature => }/gradlew (91%) mode change 100755 => 100644 rename gradle-modules/gradle-7/{dependency-version => }/gradlew.bat (100%) delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew.bat delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew delete mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew.bat create mode 100644 gradle-modules/gradle-7/multiple-repositories-demo/settings.gradle create mode 100644 gradle-modules/gradle-7/settings.gradle create mode 100644 gradle-modules/gradle-8/README.md rename gradle-modules/{gradle-7/dependency-version => gradle-8}/gradle/wrapper/gradle-wrapper.properties (82%) rename gradle-modules/{gradle-7/dependency-version => gradle-8}/gradlew (91%) mode change 100755 => 100644 rename gradle-modules/{gradle-7/toolchains-feature => gradle-8}/gradlew.bat (100%) create mode 100644 gradle-modules/gradle-8/settings.gradle rename gradle-modules/{gradle-7 => gradle-8}/toolchains-feature/.gitattributes (100%) rename gradle-modules/{gradle-7 => gradle-8}/toolchains-feature/.gitignore (100%) rename gradle-modules/{gradle-7 => gradle-8}/toolchains-feature/build.gradle (100%) rename gradle-modules/{gradle-7 => gradle-8}/toolchains-feature/settings.gradle (100%) mode change 100755 => 100644 gradle-modules/gradle-customization/gradle-protobuf/gradlew diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md index e59b59f9fd..fe05a4b9bc 100644 --- a/gradle-modules/gradle-7/README.md +++ b/gradle-modules/gradle-7/README.md @@ -5,5 +5,4 @@ - [Working With Multiple Repositories in Gradle](https://www.baeldung.com/java-gradle-multiple-repositories) - [Different Dependency Version Declarations in Gradle](https://www.baeldung.com/gradle-different-dependency-version-declarations) - [Generating Javadoc With Gradle](https://www.baeldung.com/java-gradle-javadoc) -- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) -- [Gradle Toolchains Support for JVM Projects](https://www.baeldung.com/java-gradle-toolchains-jvm-projects) +- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) \ No newline at end of file diff --git a/gradle-modules/gradle-7/conditional-dependency-demo/.gitignore b/gradle-modules/gradle-7/conditional-dependency-demo/.gitignore index c2065bc262..d33fc4ef35 100644 --- a/gradle-modules/gradle-7/conditional-dependency-demo/.gitignore +++ b/gradle-modules/gradle-7/conditional-dependency-demo/.gitignore @@ -1,7 +1,7 @@ HELP.md .gradle build/ -!gradle/wrapper/gradle-wrapper.jar +!../gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ diff --git a/gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 41d9927a4d4fb3f96a785543079b8df6723c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59821 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 diff --git a/gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 00e33edef6..0000000000 --- a/gradle-modules/gradle-7/conditional-dependency-demo/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/conditional-dependency-demo/gradlew b/gradle-modules/gradle-7/conditional-dependency-demo/gradlew deleted file mode 100755 index 1b6c787337..0000000000 --- a/gradle-modules/gradle-7/conditional-dependency-demo/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/conditional-dependency-demo/gradlew.bat b/gradle-modules/gradle-7/conditional-dependency-demo/gradlew.bat deleted file mode 100644 index 107acd32c4..0000000000 --- a/gradle-modules/gradle-7/conditional-dependency-demo/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gradle-modules/gradle-7/gradle-javadoc/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/gradle-javadoc/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/gradle-javadoc/gradlew.bat b/gradle-modules/gradle-7/gradle-javadoc/gradlew.bat deleted file mode 100644 index 53a6b238d4..0000000000 --- a/gradle-modules/gradle-7/gradle-javadoc/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gradle-modules/gradle-7/gradle-wsdl-stubs/build.gradle b/gradle-modules/gradle-7/gradle-wsdl-stubs/build.gradle index e368dc5c06..6d0cfc1972 100644 --- a/gradle-modules/gradle-7/gradle-wsdl-stubs/build.gradle +++ b/gradle-modules/gradle-7/gradle-wsdl-stubs/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id("com.github.bjornvester.wsdl2java") version "1.2" + id 'com.github.bjornvester.wsdl2java' version '2.0.2' } repositories { @@ -17,7 +17,6 @@ test { useJUnitPlatform() } - wsdl2java { - cxfVersion.set("3.4.4") + cxfVersion.set("4.0.2") } diff --git a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index ccebba7710deaf9f98673a68957ea02138b60d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61608 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 diff --git a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 42defcc94b..0000000000 --- a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew b/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew deleted file mode 100755 index 79a61d421c..0000000000 --- a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew.bat b/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew.bat deleted file mode 100644 index 6689b85bee..0000000000 --- a/gradle-modules/gradle-7/gradle-wsdl-stubs/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.properties similarity index 82% rename from gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.properties rename to gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.properties index 37aef8d3f0..878fe049c2 100644 --- a/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/toolchains-feature/gradlew b/gradle-modules/gradle-7/gradlew old mode 100755 new mode 100644 similarity index 91% rename from gradle-modules/gradle-7/toolchains-feature/gradlew rename to gradle-modules/gradle-7/gradlew index aeb74cbb43..1aa94a4269 --- a/gradle-modules/gradle-7/toolchains-feature/gradlew +++ b/gradle-modules/gradle-7/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradle-modules/gradle-7/dependency-version/gradlew.bat b/gradle-modules/gradle-7/gradlew.bat similarity index 100% rename from gradle-modules/gradle-7/dependency-version/gradlew.bat rename to gradle-modules/gradle-7/gradlew.bat diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 41d9927a4d4fb3f96a785543079b8df6723c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59821 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 diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 070cb702f0..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew deleted file mode 100755 index 1b6c787337..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew.bat b/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew.bat deleted file mode 100644 index 107acd32c4..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/multiple-repositories/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 41d9927a4d4fb3f96a785543079b8df6723c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59821 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 diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 070cb702f0..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew deleted file mode 100755 index 1b6c787337..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew.bat b/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew.bat deleted file mode 100644 index 107acd32c4..0000000000 --- a/gradle-modules/gradle-7/multiple-repositories-demo/publish-package/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/gradle-modules/gradle-7/multiple-repositories-demo/settings.gradle b/gradle-modules/gradle-7/multiple-repositories-demo/settings.gradle new file mode 100644 index 0000000000..b5c2e6ecaa --- /dev/null +++ b/gradle-modules/gradle-7/multiple-repositories-demo/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = 'multiple-repositories-demo' + +include 'multiple-repositories' +include 'publish-package' \ No newline at end of file diff --git a/gradle-modules/gradle-7/settings.gradle b/gradle-modules/gradle-7/settings.gradle new file mode 100644 index 0000000000..0685ca8f59 --- /dev/null +++ b/gradle-modules/gradle-7/settings.gradle @@ -0,0 +1,7 @@ +rootProject.name = 'gradle-7' + +include 'conditional-dependency-demo' +include 'dependency-version' +include 'gradle-javadoc' +include 'gradle-wsdl-stubs' +include 'multiple-repositories-demo' \ No newline at end of file diff --git a/gradle-modules/gradle-8/README.md b/gradle-modules/gradle-8/README.md new file mode 100644 index 0000000000..53e5fa4ae0 --- /dev/null +++ b/gradle-modules/gradle-8/README.md @@ -0,0 +1,4 @@ + +### Relevant Articles: + +- [Gradle Toolchains Support for JVM Projects](https://www.baeldung.com/java-gradle-toolchains-jvm-projects) diff --git a/gradle-modules/gradle-7/dependency-version/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.properties similarity index 82% rename from gradle-modules/gradle-7/dependency-version/gradle/wrapper/gradle-wrapper.properties rename to gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.properties index bdc9a83b1e..3fa8f862f7 100644 --- a/gradle-modules/gradle-7/dependency-version/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle-7/dependency-version/gradlew b/gradle-modules/gradle-8/gradlew old mode 100755 new mode 100644 similarity index 91% rename from gradle-modules/gradle-7/dependency-version/gradlew rename to gradle-modules/gradle-8/gradlew index 79a61d421c..1aa94a4269 --- a/gradle-modules/gradle-7/dependency-version/gradlew +++ b/gradle-modules/gradle-8/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradle-modules/gradle-7/toolchains-feature/gradlew.bat b/gradle-modules/gradle-8/gradlew.bat similarity index 100% rename from gradle-modules/gradle-7/toolchains-feature/gradlew.bat rename to gradle-modules/gradle-8/gradlew.bat diff --git a/gradle-modules/gradle-8/settings.gradle b/gradle-modules/gradle-8/settings.gradle new file mode 100644 index 0000000000..f2098b2611 --- /dev/null +++ b/gradle-modules/gradle-8/settings.gradle @@ -0,0 +1,3 @@ +rootProject.name = 'gradle-8' + +include 'toolchains-feature' \ No newline at end of file diff --git a/gradle-modules/gradle-7/toolchains-feature/.gitattributes b/gradle-modules/gradle-8/toolchains-feature/.gitattributes similarity index 100% rename from gradle-modules/gradle-7/toolchains-feature/.gitattributes rename to gradle-modules/gradle-8/toolchains-feature/.gitattributes diff --git a/gradle-modules/gradle-7/toolchains-feature/.gitignore b/gradle-modules/gradle-8/toolchains-feature/.gitignore similarity index 100% rename from gradle-modules/gradle-7/toolchains-feature/.gitignore rename to gradle-modules/gradle-8/toolchains-feature/.gitignore diff --git a/gradle-modules/gradle-7/toolchains-feature/build.gradle b/gradle-modules/gradle-8/toolchains-feature/build.gradle similarity index 100% rename from gradle-modules/gradle-7/toolchains-feature/build.gradle rename to gradle-modules/gradle-8/toolchains-feature/build.gradle diff --git a/gradle-modules/gradle-7/toolchains-feature/settings.gradle b/gradle-modules/gradle-8/toolchains-feature/settings.gradle similarity index 100% rename from gradle-modules/gradle-7/toolchains-feature/settings.gradle rename to gradle-modules/gradle-8/toolchains-feature/settings.gradle diff --git a/gradle-modules/gradle-customization/gradle-protobuf/gradlew b/gradle-modules/gradle-customization/gradle-protobuf/gradlew old mode 100755 new mode 100644 diff --git a/gradle-modules/settings.gradle b/gradle-modules/settings.gradle index 34dbd0cf53..cfd8b14d48 100644 --- a/gradle-modules/settings.gradle +++ b/gradle-modules/settings.gradle @@ -3,3 +3,5 @@ include 'gradle' include 'gradle-5' include 'gradle-6' include 'gradle-7' +include 'gradle-8' +include 'gradle-customization' From 3ee56ca66ed6aebf9f2ba92e3eaafd4b474e089c Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 4 Nov 2023 11:12:34 +0200 Subject: [PATCH 364/831] [JAVA-26735] Fixed test case --- .../primitives/PrimitiveValuesUnitTest.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/json-modules/gson/src/test/java/com/baeldung/gson/primitives/PrimitiveValuesUnitTest.java b/json-modules/gson/src/test/java/com/baeldung/gson/primitives/PrimitiveValuesUnitTest.java index e1241fa92a..00edcd426a 100644 --- a/json-modules/gson/src/test/java/com/baeldung/gson/primitives/PrimitiveValuesUnitTest.java +++ b/json-modules/gson/src/test/java/com/baeldung/gson/primitives/PrimitiveValuesUnitTest.java @@ -43,8 +43,8 @@ public class PrimitiveValuesUnitTest { gson.toJson(model); } - @Test(expected = IllegalArgumentException.class) public void - whenSerializingNaN_thenShouldRaiseAnException() { + @Test(expected = IllegalArgumentException.class) + public void whenSerializingNaN_thenShouldRaiseAnException() { FloatExample model = new FloatExample(); model.value = Float.NaN; @@ -52,7 +52,8 @@ public class PrimitiveValuesUnitTest { gson.toJson(model); } - @Test public void whenDeserializingFromJSON_thenShouldParseTheValueInTheString() { + @Test + public void whenDeserializingFromJSON_thenShouldParseTheValueInTheString() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; @@ -72,14 +73,16 @@ public class PrimitiveValuesUnitTest { // @formatter:on } - @Test public void whenDeserializingHighPrecissionNumberIntoFloat_thenShouldPerformRounding() { + @Test + public void whenDeserializingHighPrecissionNumberIntoFloat_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123456}"; Gson gson = new Gson(); FloatExample model = gson.fromJson(json, FloatExample.class); assertEquals(12.123426f, model.value, 0.000001); } - @Test public void whenDeserializingHighPrecissiongNumberIntoDouble_thenShouldPerformRounding() { + @Test + public void whenDeserializingHighPrecissiongNumberIntoDouble_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123556}"; Gson gson = new Gson(); DoubleExample model = gson.fromJson(json, DoubleExample.class); @@ -87,12 +90,12 @@ public class PrimitiveValuesUnitTest { } - @Test public void whenDeserializingValueThatOverflows_thenShouldOverflowSilently() { + @Test(expected = JsonSyntaxException.class) + public void whenDeserializingValueThatOverflows_thenShouldRaiseAnException() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; ByteExample model = gson.fromJson(json, ByteExample.class); - assertEquals(44, model.value); } @Test public void whenDeserializingRealIntoByte_thenShouldRaiseAnException() { From df78df7a81cdef885646fde4ebf589bed857149c Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 4 Nov 2023 14:53:37 +0530 Subject: [PATCH 365/831] JAVA-26394 Move java-native to core-java modules (#15092) --- {java-native => core-java-modules/java-native}/README.md | 0 {java-native => core-java-modules/java-native}/pom.xml | 6 +++--- .../src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp | 0 .../src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h | 0 .../src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp | 0 .../src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h | 0 .../src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp | 0 .../src/main/cpp/com_baeldung_jni_HelloWorldJNI.h | 0 .../cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp | 0 .../cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h | 0 .../java-native}/src/main/cpp/generateNativeLib.bat | 0 .../java-native}/src/main/cpp/generateNativeLib.sh | 0 .../java-native}/src/main/cpp/generateNativeLibMac.sh | 0 .../com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp | 0 .../com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h | 0 .../src/main/cpp/unsatisfiedlink/generateNativeLib.sh | 0 .../java-native}/src/main/java/com/baeldung/jna/CMath.java | 0 .../java-native}/src/main/java/com/baeldung/jna/Main.java | 0 .../src/main/java/com/baeldung/jna/NativeFS.java | 0 .../java-native}/src/main/java/com/baeldung/jna/StdC.java | 0 .../src/main/java/com/baeldung/jni/ExampleObjectsJNI.java | 0 .../main/java/com/baeldung/jni/ExampleParametersJNI.java | 0 .../src/main/java/com/baeldung/jni/HelloWorldJNI.java | 0 .../java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java | 0 .../src/main/java/com/baeldung/jni/UserData.java | 0 .../main/java/com/baeldung/jvmbitversion/JVMBitVersion.java | 0 .../com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java | 0 .../java-native}/src/main/resources/logback.xml | 0 .../src/main/resources/unsatisfiedlink/jni.policy | 0 .../src/test/java/com/baeldung/jna/CMathUnitTest.java | 0 .../src/test/java/com/baeldung/jna/NativeFSUnitTest.java | 0 .../src/test/java/com/baeldung/jna/StdCUnitTest.java | 0 .../src/test/java/com/baeldung/jni/JNINativeManualTest.java | 0 .../jni/registernatives/JNIRegisterNativesManualTest.java | 0 .../com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java | 0 .../unsatisfiedlink/JniUnsatisfiedLinkManualTest.java | 0 core-java-modules/pom.xml | 1 + pom.xml | 2 -- 38 files changed, 4 insertions(+), 5 deletions(-) rename {java-native => core-java-modules/java-native}/README.md (100%) rename {java-native => core-java-modules/java-native}/pom.xml (87%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/generateNativeLib.bat (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/generateNativeLib.sh (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/generateNativeLibMac.sh (100%) mode change 100755 => 100644 rename {java-native => core-java-modules/java-native}/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h (100%) rename {java-native => core-java-modules/java-native}/src/main/cpp/unsatisfiedlink/generateNativeLib.sh (100%) mode change 100755 => 100644 rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jna/CMath.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jna/Main.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jna/NativeFS.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jna/StdC.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jni/ExampleParametersJNI.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jni/HelloWorldJNI.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jni/UserData.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/jvmbitversion/JVMBitVersion.java (100%) rename {java-native => core-java-modules/java-native}/src/main/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java (100%) rename {java-native => core-java-modules/java-native}/src/main/resources/logback.xml (100%) rename {java-native => core-java-modules/java-native}/src/main/resources/unsatisfiedlink/jni.policy (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jna/CMathUnitTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jna/NativeFSUnitTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jna/StdCUnitTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jni/JNINativeManualTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jni/registernatives/JNIRegisterNativesManualTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java (100%) rename {java-native => core-java-modules/java-native}/src/test/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLinkManualTest.java (100%) diff --git a/java-native/README.md b/core-java-modules/java-native/README.md similarity index 100% rename from java-native/README.md rename to core-java-modules/java-native/README.md diff --git a/java-native/pom.xml b/core-java-modules/java-native/pom.xml similarity index 87% rename from java-native/pom.xml rename to core-java-modules/java-native/pom.xml index 95cb24bd98..2c4a8ea4ee 100644 --- a/java-native/pom.xml +++ b/core-java-modules/java-native/pom.xml @@ -7,9 +7,9 @@ java-native - com.baeldung - parent-modules - 1.0.0-SNAPSHOT + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT diff --git a/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp diff --git a/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h diff --git a/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp diff --git a/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h diff --git a/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp diff --git a/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h diff --git a/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.cpp diff --git a/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h b/core-java-modules/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h similarity index 100% rename from java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h rename to core-java-modules/java-native/src/main/cpp/com_baeldung_jni_RegisterNativesHelloWorldJNI.h diff --git a/java-native/src/main/cpp/generateNativeLib.bat b/core-java-modules/java-native/src/main/cpp/generateNativeLib.bat similarity index 100% rename from java-native/src/main/cpp/generateNativeLib.bat rename to core-java-modules/java-native/src/main/cpp/generateNativeLib.bat diff --git a/java-native/src/main/cpp/generateNativeLib.sh b/core-java-modules/java-native/src/main/cpp/generateNativeLib.sh similarity index 100% rename from java-native/src/main/cpp/generateNativeLib.sh rename to core-java-modules/java-native/src/main/cpp/generateNativeLib.sh diff --git a/java-native/src/main/cpp/generateNativeLibMac.sh b/core-java-modules/java-native/src/main/cpp/generateNativeLibMac.sh old mode 100755 new mode 100644 similarity index 100% rename from java-native/src/main/cpp/generateNativeLibMac.sh rename to core-java-modules/java-native/src/main/cpp/generateNativeLibMac.sh diff --git a/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp b/core-java-modules/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp similarity index 100% rename from java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp rename to core-java-modules/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.cpp diff --git a/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h b/core-java-modules/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h similarity index 100% rename from java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h rename to core-java-modules/java-native/src/main/cpp/unsatisfiedlink/com_baeldung_unsatisfiedlink_JniUnsatisfiedLink.h diff --git a/java-native/src/main/cpp/unsatisfiedlink/generateNativeLib.sh b/core-java-modules/java-native/src/main/cpp/unsatisfiedlink/generateNativeLib.sh old mode 100755 new mode 100644 similarity index 100% rename from java-native/src/main/cpp/unsatisfiedlink/generateNativeLib.sh rename to core-java-modules/java-native/src/main/cpp/unsatisfiedlink/generateNativeLib.sh diff --git a/java-native/src/main/java/com/baeldung/jna/CMath.java b/core-java-modules/java-native/src/main/java/com/baeldung/jna/CMath.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jna/CMath.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jna/CMath.java diff --git a/java-native/src/main/java/com/baeldung/jna/Main.java b/core-java-modules/java-native/src/main/java/com/baeldung/jna/Main.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jna/Main.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jna/Main.java diff --git a/java-native/src/main/java/com/baeldung/jna/NativeFS.java b/core-java-modules/java-native/src/main/java/com/baeldung/jna/NativeFS.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jna/NativeFS.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jna/NativeFS.java diff --git a/java-native/src/main/java/com/baeldung/jna/StdC.java b/core-java-modules/java-native/src/main/java/com/baeldung/jna/StdC.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jna/StdC.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jna/StdC.java diff --git a/java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java b/core-java-modules/java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java diff --git a/java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java b/core-java-modules/java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java diff --git a/java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java b/core-java-modules/java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java diff --git a/java-native/src/main/java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java b/core-java-modules/java-native/src/main/java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jni/RegisterNativesHelloWorldJNI.java diff --git a/java-native/src/main/java/com/baeldung/jni/UserData.java b/core-java-modules/java-native/src/main/java/com/baeldung/jni/UserData.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jni/UserData.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jni/UserData.java diff --git a/java-native/src/main/java/com/baeldung/jvmbitversion/JVMBitVersion.java b/core-java-modules/java-native/src/main/java/com/baeldung/jvmbitversion/JVMBitVersion.java similarity index 100% rename from java-native/src/main/java/com/baeldung/jvmbitversion/JVMBitVersion.java rename to core-java-modules/java-native/src/main/java/com/baeldung/jvmbitversion/JVMBitVersion.java diff --git a/java-native/src/main/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java b/core-java-modules/java-native/src/main/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java similarity index 100% rename from java-native/src/main/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java rename to core-java-modules/java-native/src/main/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLink.java diff --git a/java-native/src/main/resources/logback.xml b/core-java-modules/java-native/src/main/resources/logback.xml similarity index 100% rename from java-native/src/main/resources/logback.xml rename to core-java-modules/java-native/src/main/resources/logback.xml diff --git a/java-native/src/main/resources/unsatisfiedlink/jni.policy b/core-java-modules/java-native/src/main/resources/unsatisfiedlink/jni.policy similarity index 100% rename from java-native/src/main/resources/unsatisfiedlink/jni.policy rename to core-java-modules/java-native/src/main/resources/unsatisfiedlink/jni.policy diff --git a/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java diff --git a/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java diff --git a/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java diff --git a/java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java diff --git a/java-native/src/test/java/com/baeldung/jni/registernatives/JNIRegisterNativesManualTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jni/registernatives/JNIRegisterNativesManualTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jni/registernatives/JNIRegisterNativesManualTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jni/registernatives/JNIRegisterNativesManualTest.java diff --git a/java-native/src/test/java/com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/jvmbitversion/JVMBitVersionUnitTest.java diff --git a/java-native/src/test/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLinkManualTest.java b/core-java-modules/java-native/src/test/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLinkManualTest.java similarity index 100% rename from java-native/src/test/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLinkManualTest.java rename to core-java-modules/java-native/src/test/java/com/baeldung/unsatisfiedlink/JniUnsatisfiedLinkManualTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index bf5b90cd32..79596d2067 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -199,6 +199,7 @@ core-java-date-operations-1 core-java-httpclient + java-native diff --git a/pom.xml b/pom.xml index ab1fffa8b9..12a8f3dc1d 100644 --- a/pom.xml +++ b/pom.xml @@ -840,7 +840,6 @@ jgit jib - java-native jsoup ksqldb jsf @@ -1124,7 +1123,6 @@ jgit jib - java-native jsoup jsf ksqldb From 1baaca3e378786244dc52ce6a4ddb1e6ea0e6228 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 4 Nov 2023 10:01:25 +0000 Subject: [PATCH 366/831] [JAVA-26432] Update "Introduction to Java 8 Streams" article Clean up (#15038) --- .../streams/Java8StreamsUnitTest.java | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java index f46fa79b08..6f1cac1903 100644 --- a/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java @@ -1,7 +1,11 @@ package com.baeldung.streams; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.nio.file.Path; import java.nio.file.Paths; @@ -11,14 +15,12 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.junit.Assert.*; +class Java8StreamsUnitTest { -public class Java8StreamsUnitTest { + private static List list; - private List list; - - @Before - public void init() { + @BeforeAll + public static void init() { list = new ArrayList<>(); list.add("One"); list.add("OneAndOnly"); @@ -42,60 +44,73 @@ public class Java8StreamsUnitTest { Stream streamOf = Stream.of("a", "b", "c"); assertEquals(streamOf.count(), 3); - long count = list.stream().distinct().count(); + long count = list.stream() + .distinct() + .count(); assertEquals(count, 9); } @Test - public void checkStreamCount_whenOperationFilter_thanCorrect() { - Stream streamFilter = list.stream().filter(element -> element.isEmpty()); + void checkStreamCount_whenOperationFilter_thanCorrect() { + Stream streamFilter = list.stream() + .filter(element -> element.isEmpty()); assertEquals(streamFilter.count(), 2); } @Test - public void checkStreamCount_whenOperationMap_thanCorrect() { + void checkStreamCount_whenOperationMap_thanCorrect() { List uris = new ArrayList<>(); uris.add("C:\\My.txt"); - Stream streamMap = uris.stream().map(uri -> Paths.get(uri)); + Stream streamMap = uris.stream() + .map(uri -> Paths.get(uri)); assertEquals(streamMap.count(), 1); List details = new ArrayList<>(); details.add(new Detail()); details.add(new Detail()); - Stream streamFlatMap = details.stream().flatMap(detail -> detail.getParts().stream()); + Stream streamFlatMap = details.stream() + .flatMap(detail -> detail.getParts() + .stream()); assertEquals(streamFlatMap.count(), 4); } @Test - public void checkStreamCount_whenOperationMatch_thenCorrect() { - boolean isValid = list.stream().anyMatch(element -> element.contains("h")); - boolean isValidOne = list.stream().allMatch(element -> element.contains("h")); - boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h")); + void checkStreamCount_whenOperationMatch_thenCorrect() { + boolean isValid = list.stream() + .anyMatch(element -> element.contains("h")); + boolean isValidOne = list.stream() + .allMatch(element -> element.contains("h")); + boolean isValidTwo = list.stream() + .noneMatch(element -> element.contains("h")); assertTrue(isValid); assertFalse(isValidOne); assertFalse(isValidTwo); } @Test - public void checkStreamReducedValue_whenOperationReduce_thenCorrect() { + void checkStreamReducedValue_whenOperationReduce_thenCorrect() { List integers = new ArrayList<>(); integers.add(1); integers.add(1); integers.add(1); - Integer reduced = integers.stream().reduce(23, (a, b) -> a + b); + Integer reduced = integers.stream() + .reduce(23, (a, b) -> a + b); assertTrue(reduced == 26); } @Test - public void checkStreamContains_whenOperationCollect_thenCorrect() { - List resultList = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList()); + void checkStreamContains_whenOperationCollect_thenCorrect() { + List resultList = list.stream() + .map(element -> element.toUpperCase()) + .collect(Collectors.toList()); assertEquals(resultList.size(), list.size()); assertTrue(resultList.contains("")); } @Test public void checkParallelStream_whenDoWork() { - list.parallelStream().forEach(element -> doWork(element)); + list.parallelStream() + .forEach(element -> doWork(element)); } private void doWork(String string) { From d9fd96773e203e27af2ff494e1d20a3a5e21bcd4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 4 Nov 2023 13:23:42 +0000 Subject: [PATCH 367/831] [JAVA-26720] Upgraded opencsv to 5.8 version (#15126) --- core-java-modules/core-java-io-conversions-2/pom.xml | 2 +- core-java-modules/core-java-string-operations-4/pom.xml | 2 +- .../commaseparatedstring/SplitCommaSeparatedString.java | 3 ++- .../SplitCommaSeparatedStringUnitTest.java | 4 +++- libraries-data-io/pom.xml | 2 +- libraries-io/pom.xml | 2 +- spring-batch/pom.xml | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-io-conversions-2/pom.xml b/core-java-modules/core-java-io-conversions-2/pom.xml index 2c49bbfd81..9be165eaff 100644 --- a/core-java-modules/core-java-io-conversions-2/pom.xml +++ b/core-java-modules/core-java-io-conversions-2/pom.xml @@ -56,7 +56,7 @@ 11 11 20200518 - 4.1 + 5.8 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml index 5cd1bd3c56..27c2bf91bd 100644 --- a/core-java-modules/core-java-string-operations-4/pom.xml +++ b/core-java-modules/core-java-string-operations-4/pom.xml @@ -58,7 +58,7 @@ 11 11 - 4.1 + 5.8 5.3.13 3.12.0 1.10.0 diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java index c3bbdb4dfb..f2ae96128c 100644 --- a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java +++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java @@ -12,6 +12,7 @@ import com.opencsv.CSVParser; import com.opencsv.CSVParserBuilder; import com.opencsv.CSVReader; import com.opencsv.CSVReaderBuilder; +import com.opencsv.exceptions.CsvException; public class SplitCommaSeparatedString { @@ -50,7 +51,7 @@ public class SplitCommaSeparatedString { return splitter.splitToList(input); } - public static List splitMultiLineWithOpenCSV(String input) throws IOException { + public static List splitMultiLineWithOpenCSV(String input) throws IOException, CsvException { CSVParser parser = new CSVParserBuilder().withSeparator(',') .build(); diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java index ca34430099..953acc6c78 100644 --- a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java +++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java @@ -14,6 +14,8 @@ import java.util.List; import org.junit.Test; +import com.opencsv.exceptions.CsvException; + public class SplitCommaSeparatedStringUnitTest { @Test @@ -27,7 +29,7 @@ public class SplitCommaSeparatedStringUnitTest { } @Test - public void givenMultiLineInput_whenParsing_shouldIgnoreCommasInsideDoubleQuotes() throws IOException { + public void givenMultiLineInput_whenParsing_shouldIgnoreCommasInsideDoubleQuotes() throws IOException, CsvException { String input = "baeldung,tutorial,splitting,text,\"ignoring this comma,\"" + System.lineSeparator() + "splitting,a,regular,line,no double quotes"; diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml index 2e126610d4..d83357b27a 100644 --- a/libraries-data-io/pom.xml +++ b/libraries-data-io/pom.xml @@ -101,7 +101,7 @@ 1.21 4.0.1 1.7.0 - 4.1 + 5.8 1.23.0 v4-rev493-1.21.0 6.1.2 diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml index fa89ebeabe..08ad0afc3f 100644 --- a/libraries-io/pom.xml +++ b/libraries-io/pom.xml @@ -59,7 +59,7 @@ 0.27.0 2.4 2.9.0 - 5.7.1 + 5.8 17 17 UTF-8 diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index 7d9becf089..20b0ef6d1c 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -74,7 +74,7 @@ 6.0.6 - 5.7.1 + 5.8 4.0.0 4.0.2 2.14.2 From 1394665355ba988ac79b65b98158fa3cd1c0eb97 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:46:09 -0400 Subject: [PATCH 368/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../ordering/SinglePartitionIntegrationTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 0c65618014..068d536b1a 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -68,18 +68,7 @@ public class SinglePartitionIntegrationTest { admin = Admin.create(adminProperties); - List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR); - topicList.add(newTopic); - CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(Config.SINGLE_PARTITION_TOPIC); - future.whenComplete((voidResult, exception) -> { - if (exception != null) { - System.err.println("Error creating the topic: " + exception.getMessage()); - } else { - System.out.println("Topic created successfully!"); - } - }).get(); + admin.createTopics(ImmutableList.of(new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR))).all().get(); } @AfterAll From c2453a503f9e7168469f5fa32084c632b1380913 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:46:17 -0400 Subject: [PATCH 369/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../ExtSeqWithTimeWindowIntegrationTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index a18efe9961..f723d290c2 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -62,18 +62,7 @@ public class ExtSeqWithTimeWindowIntegrationTest { admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); - List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR); - topicList.add(newTopic); - CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(Config.MULTI_PARTITION_TOPIC); - future.whenComplete((voidResult, exception) -> { - if (exception != null) { - System.err.println("Error creating the topic: " + exception.getMessage()); - } else { - System.out.println("Topic created successfully!"); - } - }).get(); + admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))).all().get(); } @AfterAll From e5da66643251d2f66eecd0ca3d607e10fa143179 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:49:26 -0400 Subject: [PATCH 370/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../ordering/MultiplePartitionIntegrationTest.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index 64a063c6c9..88281014b6 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -60,18 +60,7 @@ public class MultiplePartitionIntegrationTest { admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); - List topicList = new ArrayList<>(); - NewTopic newTopic = new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR); - topicList.add(newTopic); - CreateTopicsResult result = admin.createTopics(topicList); - KafkaFuture future = result.values().get(Config.MULTI_PARTITION_TOPIC); - future.whenComplete((voidResult, exception) -> { - if (exception != null) { - System.err.println("Error creating the topic: " + exception.getMessage()); - } else { - System.out.println("Topic created successfully!"); - } - }).get(); + admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))).all().get(); } @AfterAll From 41ab2ed2213b8a20fbeb8f3ee52357757b552e31 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:55:03 -0400 Subject: [PATCH 371/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java Co-authored-by: Liam Williams --- .../com/baeldung/kafka/message/ordering/payload/UserEvent.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java index 0c4018e624..040c7d6995 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java @@ -3,9 +3,7 @@ package com.baeldung.kafka.message.ordering.payload; import java.util.Objects; public class UserEvent implements Comparable { private String userEventId; - private long eventNanoTime; - private long globalSequenceNumber; public UserEvent(){ From 0399cf0e5f0d788367d5209def3ad41be8ae92d3 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:55:32 -0400 Subject: [PATCH 372/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java Co-authored-by: Liam Williams --- .../baeldung/kafka/message/ordering/payload/UserEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java index 040c7d6995..67e6b70c08 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java @@ -6,11 +6,11 @@ public class UserEvent implements Comparable { private long eventNanoTime; private long globalSequenceNumber; + @SuppressWarnings("unused") public UserEvent(){ - + // Required for Jackson Serialization and Deserialization } - //Required for Kafka Serialization and Deserialization public UserEvent(String userEventId) { this.userEventId = userEventId; } From d4842ac511422a11dd746d07d337fe9dda74e76f Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:56:07 -0400 Subject: [PATCH 373/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java Co-authored-by: Liam Williams --- .../message/ordering/serialization/JacksonDeserializer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index be2b104761..2cc0bde853 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -8,7 +8,6 @@ import java.util.Map; /** * Configured via {@link org.apache.kafka.clients.consumer.ConsumerConfig#VALUE_DESERIALIZER_CLASS_CONFIG} */ -@SuppressWarnings("unused") public class JacksonDeserializer implements Deserializer { private final ObjectMapper objectMapper = new ObjectMapper(); private Class type; From aeb5f55e0e27a67aaa18fd756fdf21664e56f6d4 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:56:47 -0400 Subject: [PATCH 374/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java Co-authored-by: Liam Williams --- .../message/ordering/serialization/JacksonDeserializer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 2cc0bde853..300a43ca7c 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -33,9 +33,8 @@ public class JacksonDeserializer implements Deserializer { try { return objectMapper.readValue(bytes, type); } catch (Exception e) { - //throw new RuntimeException("Error deserializing value", e); + throw new RuntimeException("Error deserializing value", e); } - return null; } } From 9a76f1a6375eceba23f8ce24748db06e9c1519f8 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:57:02 -0400 Subject: [PATCH 375/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../message/ordering/ExtSeqWithTimeWindowIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index f723d290c2..e9a77bd2d7 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -29,7 +29,7 @@ import java.util.concurrent.Future; import static org.junit.jupiter.api.Assertions.*; @Testcontainers -public class ExtSeqWithTimeWindowIntegrationTest { +public class ExternalSequenceWithTimeWindowIntegrationTest { private static Admin admin; private static KafkaProducer producer; From 33b18c0ca49d4814eb032df2122dc302e2bb5ebf Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:57:19 -0400 Subject: [PATCH 376/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../message/ordering/ExtSeqWithTimeWindowIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index e9a77bd2d7..f47a01486c 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -92,7 +92,7 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { records.forEach(record -> { buffer.add(record.value()); }); - while (buffer.size() > 0) { + while (!buffer.isEmpty()) { if (System.nanoTime() - lastProcessedTime > BUFFER_PERIOD_NS) { processBuffer(buffer, receivedUserEventList); lastProcessedTime = System.nanoTime(); From 3e2975196d8842459acfaa23d4b22b86e5d08f1b Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:57:32 -0400 Subject: [PATCH 377/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java Co-authored-by: Liam Williams --- .../ExtSeqWithTimeWindowIntegrationTest.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java index f47a01486c..76e4a47d17 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java @@ -102,16 +102,9 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { buffer.add(record.value()); }); } - for (int insertPosition = 0; insertPosition <= receivedUserEventList.size() - 1; insertPosition++) { - if (isOrderMaintained){ - UserEvent sentUserEvent = sentUserEventList.get(insertPosition); - UserEvent receivedUserEvent = receivedUserEventList.get(insertPosition); - if (!sentUserEvent.equals(receivedUserEvent)) { - isOrderMaintained = false; - } - } - } - assertTrue(isOrderMaintained); + assertThat(receivedUserEventList) + .isEqualTo(sentUserEventList) + .containsExactlyElementsOf(sentUserEventList); } private static void processBuffer(List buffer, List receivedUserEventList) { From 9c463c752b17ca3843490cef337a44f1a96f07f3 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:57:47 -0400 Subject: [PATCH 378/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../ordering/MultiplePartitionIntegrationTest.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index 88281014b6..752514c09a 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -89,15 +89,8 @@ public class MultiplePartitionIntegrationTest { receivedUserEventList.add(userEvent); System.out.println("User Event ID: " + userEvent.getUserEventId()); }); - for (int insertPosition = 0; insertPosition <= receivedUserEventList.size() - 1; insertPosition++) { - if (isOrderMaintained){ - UserEvent sentUserEvent = sentUserEventList.get(insertPosition); - UserEvent receivedUserEvent = receivedUserEventList.get(insertPosition); - if (!sentUserEvent.equals(receivedUserEvent)) { - isOrderMaintained = false; - } - } - } - assertFalse(isOrderMaintained); + assertThat(receivedUserEventList) + .isNotEqualTo(sentUserEventList) + .containsExactlyInAnyOrderElementsOf(sentUserEventList); } } From ddc5e0a5efbfb15a8a19c6bf0b91a2986883efbe Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:58:01 -0400 Subject: [PATCH 379/831] Update apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java Co-authored-by: Liam Williams --- .../ordering/SinglePartitionIntegrationTest.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 068d536b1a..a767133627 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -97,14 +97,8 @@ public class SinglePartitionIntegrationTest { receivedUserEventList.add(userEvent); System.out.println("User Event ID: " + userEvent.getUserEventId()); }); - boolean result = true; - for (int count = 0; count <= 9; count++) { - UserEvent sentUserEvent = sentUserEventList.get(count); - UserEvent receivedUserEvent = receivedUserEventList.get(count); - if (!sentUserEvent.equals(receivedUserEvent) && result) { - result = false; - } - } - assertTrue(result); + assertThat(receivedUserEventList) + .isEqualTo(sentUserEventList) + .containsExactlyElementsOf(sentUserEventList); } } From cb274a7ed4a86fbdb1fa129d1a68c31d316a8011 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:58:28 -0400 Subject: [PATCH 380/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java Co-authored-by: Liam Williams --- .../kafka/message/ordering/serialization/JacksonSerializer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java index 2d7432cc7b..4c081de3cc 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java @@ -6,7 +6,6 @@ import org.apache.kafka.common.serialization.Serializer; /** * Configured via {@link org.apache.kafka.clients.producer.ProducerConfig#VALUE_SERIALIZER_CLASS_CONFIG} */ -@SuppressWarnings("unused") public class JacksonSerializer implements Serializer { private final ObjectMapper objectMapper = new ObjectMapper(); From b24851bfcee4223b94d51e5b3d2d079824f8cb09 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 16:59:10 -0400 Subject: [PATCH 381/831] Update apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java Co-authored-by: Liam Williams --- .../ordering/serialization/JacksonDeserializer.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 300a43ca7c..4868ecaf2e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -12,13 +12,6 @@ public class JacksonDeserializer implements Deserializer { private final ObjectMapper objectMapper = new ObjectMapper(); private Class type; - public JacksonDeserializer(Class type) { - this.type = type; - } - - public JacksonDeserializer() { - - } @Override public void configure(Map configs, boolean isKey) { From 2cecae1dfb6af13c311e48d89dfc38d1f70ba181 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 17:18:20 -0400 Subject: [PATCH 382/831] Incorporate Review comments --- .../com/baeldung/kafka/message/ordering/Config.java | 2 +- ...ternalSequenceWithTimeWindowIntegrationTest.java} | 12 +++++------- .../ordering/MultiplePartitionIntegrationTest.java | 7 +++---- .../ordering/SinglePartitionIntegrationTest.java | 6 ++---- 4 files changed, 11 insertions(+), 16 deletions(-) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{ExtSeqWithTimeWindowIntegrationTest.java => ExternalSequenceWithTimeWindowIntegrationTest.java} (95%) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java index 9cc6314309..7fae8403b5 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/Config.java @@ -7,5 +7,5 @@ public class Config { public static final int MULTIPLE_PARTITIONS = 5; public static final int SINGLE_PARTITION = 1; - public static short REPLICATION_FACTOR = 1; + public static final short REPLICATION_FACTOR = 1; } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java similarity index 95% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java index 76e4a47d17..0c64f663f3 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExtSeqWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java @@ -11,7 +11,6 @@ import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.KafkaFuture; import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; @@ -25,8 +24,8 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; - -import static org.junit.jupiter.api.Assertions.*; +import com.google.common.collect.ImmutableList; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers public class ExternalSequenceWithTimeWindowIntegrationTest { @@ -84,7 +83,6 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } - boolean isOrderMaintained = true; consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); List buffer = new ArrayList<>(); long lastProcessedTime = System.nanoTime(); @@ -102,9 +100,9 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { buffer.add(record.value()); }); } - assertThat(receivedUserEventList) - .isEqualTo(sentUserEventList) - .containsExactlyElementsOf(sentUserEventList); + assertThat(receivedUserEventList) + .isEqualTo(sentUserEventList) + .containsExactlyElementsOf(sentUserEventList); } private static void processBuffer(List buffer, List receivedUserEventList) { diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index 752514c09a..2fde24114c 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -11,7 +11,6 @@ import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.KafkaFuture; import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; @@ -25,8 +24,8 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; - -import static org.junit.jupiter.api.Assertions.*; +import com.google.common.collect.ImmutableList; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers public class MultiplePartitionIntegrationTest { @@ -89,7 +88,7 @@ public class MultiplePartitionIntegrationTest { receivedUserEventList.add(userEvent); System.out.println("User Event ID: " + userEvent.getUserEventId()); }); - assertThat(receivedUserEventList) + assertThat(receivedUserEventList) .isNotEqualTo(sentUserEventList) .containsExactlyInAnyOrderElementsOf(sentUserEventList); } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index a767133627..0826365f97 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -5,7 +5,6 @@ import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.AdminClientConfig; -import org.apache.kafka.clients.admin.CreateTopicsResult; import org.apache.kafka.clients.admin.NewTopic; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; @@ -14,7 +13,6 @@ import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.KafkaFuture; import org.apache.kafka.common.serialization.LongDeserializer; import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; @@ -29,8 +27,8 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; - -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.google.common.collect.ImmutableList; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers public class SinglePartitionIntegrationTest { From 2a6e561f769cd38cfa43c2c1d7742a24b43e52d7 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 18:09:21 -0400 Subject: [PATCH 383/831] Fixed unit test case failures --- .../kafka/message/ordering/payload/UserEvent.java | 10 +++++++--- .../ordering/MultiplePartitionIntegrationTest.java | 6 +++--- .../ordering/SinglePartitionIntegrationTest.java | 3 ++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java index 67e6b70c08..676b469ce8 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java @@ -42,15 +42,19 @@ public class UserEvent implements Comparable { @Override public boolean equals(Object obj) { - if (obj == this) { + if (this == obj) { return true; } if (!(obj instanceof UserEvent)) { return false; } UserEvent userEvent = (UserEvent) obj; - return Objects.equals(this.userEventId, userEvent.getUserEventId()) - && userEvent.getEventNanoTime() == this.eventNanoTime; + return this.globalSequenceNumber == userEvent.globalSequenceNumber; + } + + @Override + public int hashCode() { + return Objects.hash(globalSequenceNumber); } } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index 2fde24114c..0405184074 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -71,16 +71,16 @@ public class MultiplePartitionIntegrationTest { void givenMultiplePartitions_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); - for (long count = 1; count <= 10 ; count++) { + for (long sequenceNumber = 1; sequenceNumber <= 10; sequenceNumber++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setGlobalSequenceNumber(sequenceNumber); userEvent.setEventNanoTime(System.nanoTime()); - Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, count, userEvent)); + Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } - boolean isOrderMaintained = true; consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); ConsumerRecords records = consumer.poll(TIMEOUT_WAIT_FOR_MESSAGES); records.forEach(record -> { diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 0826365f97..39d298826c 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -78,8 +78,9 @@ public class SinglePartitionIntegrationTest { void givenASinglePartition_whenPublishedToKafkaAndConsumed_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); - for (long count = 1; count <= 10; count++) { + for (long sequenceNumber = 1; sequenceNumber <= 10; sequenceNumber++) { UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + userEvent.setGlobalSequenceNumber(sequenceNumber); userEvent.setEventNanoTime(System.nanoTime()); ProducerRecord producerRecord = new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, userEvent); Future future = producer.send(producerRecord); From 80cd71fff3e37122a22884fa85b394537e709e20 Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sat, 4 Nov 2023 18:33:09 -0400 Subject: [PATCH 384/831] Removing slf4j-log4j12, deleting log4j.properties and adding a standard src/test/resources/logback.xml, since the Kafka libraries use the logback SLF4J binding. --- apache-kafka-2/log4j.properties | 1 - apache-kafka-2/pom.xml | 5 ----- ...ExternalSequenceWithTimeWindowIntegrationTest.java | 9 +++++++-- .../ordering/MultiplePartitionIntegrationTest.java | 8 ++++++-- .../ordering/SinglePartitionIntegrationTest.java | 7 +++++-- apache-kafka-2/src/test/resources/logback.xml | 11 +++++++++++ 6 files changed, 29 insertions(+), 12 deletions(-) delete mode 100644 apache-kafka-2/log4j.properties create mode 100644 apache-kafka-2/src/test/resources/logback.xml diff --git a/apache-kafka-2/log4j.properties b/apache-kafka-2/log4j.properties deleted file mode 100644 index 2173c5d96f..0000000000 --- a/apache-kafka-2/log4j.properties +++ /dev/null @@ -1 +0,0 @@ -log4j.rootLogger=INFO, stdout diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index d0838a386e..d1f74e8aae 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -23,11 +23,6 @@ slf4j-api ${org.slf4j.version} - - org.slf4j - slf4j-log4j12 - ${org.slf4j.version} - com.google.guava guava diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java index 0c64f663f3..a5ec7a98a3 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.kafka.message.ordering; +import com.baeldung.kafka.headers.KafkaMessageHeaders; import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; @@ -16,6 +17,8 @@ import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -36,6 +39,8 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5).toNanos(); + private static Logger logger = LoggerFactory.getLogger(ExternalSequenceWithTimeWindowIntegrationTest.class); + @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -80,7 +85,7 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); + logger.info("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); @@ -109,7 +114,7 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { Collections.sort(buffer); buffer.forEach(userEvent -> { receivedUserEventList.add(userEvent); - System.out.println("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", User Event Id: " + userEvent.getUserEventId()); + logger.info("Processing message with Global Sequence number: " + userEvent.getGlobalSequenceNumber() + ", User Event Id: " + userEvent.getUserEventId()); }); buffer.clear(); } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index 0405184074..adfa9a0399 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -16,6 +16,8 @@ import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -34,6 +36,8 @@ public class MultiplePartitionIntegrationTest { private static KafkaProducer producer; private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); + + private static Logger logger = LoggerFactory.getLogger(MultiplePartitionIntegrationTest.class); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -78,7 +82,7 @@ public class MultiplePartitionIntegrationTest { Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); + logger.info("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } consumer.subscribe(Collections.singletonList(Config.MULTI_PARTITION_TOPIC)); @@ -86,7 +90,7 @@ public class MultiplePartitionIntegrationTest { records.forEach(record -> { UserEvent userEvent = record.value(); receivedUserEventList.add(userEvent); - System.out.println("User Event ID: " + userEvent.getUserEventId()); + logger.info("User Event ID: " + userEvent.getUserEventId()); }); assertThat(receivedUserEventList) .isNotEqualTo(sentUserEventList) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 39d298826c..7280a1218a 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -18,6 +18,8 @@ import org.apache.kafka.common.serialization.LongSerializer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -39,6 +41,7 @@ public class SinglePartitionIntegrationTest { private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); + private static Logger logger = LoggerFactory.getLogger(SinglePartitionIntegrationTest.class); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); @@ -86,7 +89,7 @@ public class SinglePartitionIntegrationTest { Future future = producer.send(producerRecord); sentUserEventList.add(userEvent); RecordMetadata metadata = future.get(); - System.out.println("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); + logger.info("User Event ID: " + userEvent.getUserEventId() + ", Partition : " + metadata.partition()); } consumer.subscribe(Collections.singletonList(Config.SINGLE_PARTITION_TOPIC)); @@ -94,7 +97,7 @@ public class SinglePartitionIntegrationTest { records.forEach(record -> { UserEvent userEvent = record.value(); receivedUserEventList.add(userEvent); - System.out.println("User Event ID: " + userEvent.getUserEventId()); + logger.info("User Event ID: " + userEvent.getUserEventId()); }); assertThat(receivedUserEventList) .isEqualTo(sentUserEventList) diff --git a/apache-kafka-2/src/test/resources/logback.xml b/apache-kafka-2/src/test/resources/logback.xml new file mode 100644 index 0000000000..6156c2188e --- /dev/null +++ b/apache-kafka-2/src/test/resources/logback.xml @@ -0,0 +1,11 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file From cea912e42ff8fc40bac122b0e78625f5ca92811a Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Sat, 4 Nov 2023 15:33:30 -0700 Subject: [PATCH 385/831] BAEL-5852: remove comments --- .../src/main/java/com/baeldung/holder/SupplierService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java index 473a4de423..66889f99bf 100644 --- a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java +++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java @@ -2,8 +2,6 @@ package com.baeldung.holder; public class SupplierService { public void getSupplierByZipCode(String zip, Holder resultHolder) { - // Let's pretend we did some work here to get the supplier - // And let's say all zip codes starting with "9" are valid, just for this example if (zip.startsWith("9")) { resultHolder.value = true; } else { From ee97389e28c04795bd0c45a543a5eebfce05429f Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Sat, 4 Nov 2023 15:38:37 -0700 Subject: [PATCH 386/831] BAEL-5755: remove BAEL-5852 commits --- .../main/java/com/baeldung/holder/Holder.java | 9 ------ .../com/baeldung/holder/SupplierService.java | 11 ------- .../holder/SupplierServiceUnitTest.java | 31 ------------------- 3 files changed, 51 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java delete mode 100644 core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java delete mode 100644 core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java deleted file mode 100644 index da066ee5c6..0000000000 --- a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/Holder.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.holder; - -public class Holder { - public T value; - - public Holder(T value) { - this.value = value; - } -} diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java deleted file mode 100644 index 66889f99bf..0000000000 --- a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/holder/SupplierService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.holder; - -public class SupplierService { - public void getSupplierByZipCode(String zip, Holder resultHolder) { - if (zip.startsWith("9")) { - resultHolder.value = true; - } else { - resultHolder.value = false; - } - } -} diff --git a/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java deleted file mode 100644 index e1446fc229..0000000000 --- a/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/holder/SupplierServiceUnitTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.holder; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -public class SupplierServiceUnitTest { - - @Test - public void givenValidZipCode_whenGetSupplierByZipCode_thenTrue() { - SupplierService service = new SupplierService(); - Holder resultHolder = new Holder<>(false); - String zipCode = "98682"; - - service.getSupplierByZipCode(zipCode, resultHolder); - - assertTrue(resultHolder.value); - } - - @Test - public void givenInvalidZipCode_whenGetSupplierByZipCode_thenFalse() { - SupplierService service = new SupplierService(); - Holder resultHolder = new Holder<>(true); - String zipCode = "12345"; - - service.getSupplierByZipCode(zipCode, resultHolder); - - assertFalse(resultHolder.value); - } -} From 89744aff6c5287bd014140e0698c39b45f379293 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Sun, 5 Nov 2023 05:06:13 +0200 Subject: [PATCH 387/831] This commit is related to BAEL-7161 (#15132) This commit aims to add a test class "StreamToMapAndMultiMapUnitTest" that provides several approaches to convert Java stream to Map or MultiMap. --- .../StreamToMapAndMultiMapUnitTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java new file mode 100644 index 0000000000..4d957fd704 --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java @@ -0,0 +1,100 @@ +package com.baeldung.streamtomapandmultimap; + +import com.google.common.collect.LinkedHashMultimap; +import org.junit.Test; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; + +public class StreamToMapAndMultiMapUnitTest { + @Test + public void givenStringStream_whenConvertingToMapWithMerge_thenExpectedMapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map mergedMap = stringStream.collect( + Collectors.toMap(s -> s, s -> s, (s1, s2) -> s1 + ", " + s2) + ); + + // Define the expected map + Map expectedMap = Map.of( + "one", "one", + "two", "two, two", + "three", "three" + ); + + assertEquals(expectedMap, mergedMap); + } + + @Test + public void givenStringStream_whenConvertingToMultimap_thenExpectedMultimapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + LinkedHashMultimap multimap = LinkedHashMultimap.create(); + + stringStream.collect(Collectors.groupingBy( + s -> s, + Collectors.mapping(s -> s, Collectors.toList()) + )).forEach((key, value) -> multimap.putAll(key, value)); + + LinkedHashMultimap expectedMultimap = LinkedHashMultimap.create(); + expectedMultimap.put("one", "one"); + expectedMultimap.put("two", "two"); + expectedMultimap.put("three", "three"); + + assertEquals(expectedMultimap, multimap); + } + + @Test + public void givenStringStream_whenConvertingToMultimapWithStreamReduce_thenExpectedMultimapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map> multimap = stringStream.reduce( + new HashMap<>(), + (map, element) -> { + map.computeIfAbsent(element, k -> new ArrayList<>()).add(element); + return map; + }, + (map1, map2) -> { + map2.forEach((key, value) -> map1.merge(key, value, (list1, list2) -> { + list1.addAll(list2); + return list1; + })); + return map1; + } + ); + + Map> expectedMultimap = new HashMap<>(); + expectedMultimap.put("one", Collections.singletonList("one")); + expectedMultimap.put("two", Arrays.asList("two", "two")); + expectedMultimap.put("three", Collections.singletonList("three")); + + assertEquals(expectedMultimap, multimap); + } + + @Test + public void givenStringStream_whenConvertingToMapWithStreamReduce_thenExpectedMapIsGenerated() { + Stream stringStream = Stream.of("one", "two", "three", "two"); + + Map resultMap = stringStream.reduce( + new HashMap<>(), + (map, element) -> { + map.put(element, element); + return map; + }, + (map1, map2) -> { + map1.putAll(map2); + return map1; + } + ); + + Map expectedMap = new HashMap<>(); + expectedMap.put("one", "one"); + expectedMap.put("two", "two"); + expectedMap.put("three", "three"); + + assertEquals(expectedMap, resultMap); + } +} \ No newline at end of file From 88a874082de402224520387bfb59d2ed05c0eb78 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:49:07 +0800 Subject: [PATCH 388/831] Update README.md [skip ci] --- core-java-modules/core-java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/README.md b/core-java-modules/core-java-strings/README.md index dbbfcc79b6..e782793fea 100644 --- a/core-java-modules/core-java-strings/README.md +++ b/core-java-modules/core-java-strings/README.md @@ -15,3 +15,4 @@ Listed here there are only those articles that does not fit into other core-java - [Java Multi-line String](https://www.baeldung.com/java-multiline-string) - [Reuse StringBuilder for Efficiency](https://www.baeldung.com/java-reuse-stringbuilder-for-efficiency) - [How to Iterate Over the String Characters in Java](https://www.baeldung.com/java-iterate-string-characters) +- [Passing Strings by Reference in Java](https://www.baeldung.com/java-method-pass-string-reference) From 252696e2b3572fed41fee8cd65e51ef483ddc010 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:58:15 +0800 Subject: [PATCH 389/831] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-3/README.md b/core-java-modules/core-java-concurrency-basic-3/README.md index 179a69495c..09d085a32b 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -11,4 +11,5 @@ This module contains articles about basic Java concurrency. - [CompletableFuture and ThreadPool in Java](https://www.baeldung.com/java-completablefuture-threadpool) - [CompletableFuture allOf().join() vs. CompletableFuture.join()](https://www.baeldung.com/java-completablefuture-allof-join) - [Retry Logic with CompletableFuture](https://www.baeldung.com/java-completablefuture-retry-logic) +- [Convert From List of CompletableFuture to CompletableFuture List](https://www.baeldung.com/java-completablefuture-list-convert) - [[<-- Prev]](../core-java-concurrency-basic-2) From 67d1902524af4d229dd672b8fb1b57fac0cd68de Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:02:33 +0800 Subject: [PATCH 390/831] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index 3ec3220424..043e0c1ee3 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -8,3 +8,4 @@ This module contains articles about core Java input/output(IO) APIs. - [Check if a File Is Empty in Java](https://www.baeldung.com/java-check-file-empty) - [Converting Relative to Absolute Paths in Java](https://www.baeldung.com/java-from-relative-to-absolute-paths) - [Detect EOF in Java](https://www.baeldung.com/java-file-detect-end-of-file) +- [PrintWriter vs. FileWriter in Java](https://www.baeldung.com/java-printwriter-filewriter-difference) From 9d7705309e0e2453b128b000bb8a10939866fdde Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:08:59 +0800 Subject: [PATCH 391/831] Create README.md [skip ci] --- persistence-modules/spring-jdbc-2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/spring-jdbc-2/README.md diff --git a/persistence-modules/spring-jdbc-2/README.md b/persistence-modules/spring-jdbc-2/README.md new file mode 100644 index 0000000000..5edb34f4c5 --- /dev/null +++ b/persistence-modules/spring-jdbc-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [A Guide to Spring 6 JdbcClient API](https://www.baeldung.com/spring-6-jdbcclient-api) From 686196c0402c773681add1669951be7ebc86b56c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:16:48 +0800 Subject: [PATCH 392/831] Update README.md [skip ci] --- core-java-modules/core-java-io-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-5/README.md b/core-java-modules/core-java-io-5/README.md index 3cc514e087..4578cf3777 100644 --- a/core-java-modules/core-java-io-5/README.md +++ b/core-java-modules/core-java-io-5/README.md @@ -5,5 +5,6 @@ This module contains articles about core Java input and output (IO) ### Relevant Articles: - [Get File Extension From MIME Type in Java](https://www.baeldung.com/java-mime-type-file-extension) - [How to Remove Line Breaks From a File in Java](https://www.baeldung.com/java-file-remove-line-breaks) +- [Difference Between ZipFile and ZipInputStream in Java](https://www.baeldung.com/java-zipfile-vs-zipinputstream) - [[<-- Prev]](/core-java-modules/core-java-io-4) From 4ee135819b1b11dc3b1cd6505fc8602d3c85afc0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:24:26 +0800 Subject: [PATCH 393/831] Create README.md [skip ci] --- libraries-llms/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 libraries-llms/README.md diff --git a/libraries-llms/README.md b/libraries-llms/README.md new file mode 100644 index 0000000000..78a621ffa6 --- /dev/null +++ b/libraries-llms/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Introduction to LangChain](https://www.baeldung.com/java-langchain-basics) From ac7cedb7efabac67821b43ad7bb39b9c22d7942a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:30:32 +0800 Subject: [PATCH 394/831] Update README.md [skip ci] --- xml-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml-2/README.md b/xml-2/README.md index e91078dbf0..cc60ae2764 100644 --- a/xml-2/README.md +++ b/xml-2/README.md @@ -7,3 +7,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Pretty-Print XML in Java](https://www.baeldung.com/java-pretty-print-xml) - [Validate an XML File Against an XSD File](https://www.baeldung.com/java-validate-xml-xsd) - [Converting JSON to XML in Java](https://www.baeldung.com/java-convert-json-to-xml) +- [Convert an XML Object to a String in Java](https://www.baeldung.com/java-convert-xml-object-string) From 0391a9c840e86573800ad1032b9a58142b45f5bc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:35:00 +0800 Subject: [PATCH 395/831] Update README.md [skip ci] --- xml-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml-2/README.md b/xml-2/README.md index cc60ae2764..e9c1a07586 100644 --- a/xml-2/README.md +++ b/xml-2/README.md @@ -8,3 +8,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Validate an XML File Against an XSD File](https://www.baeldung.com/java-validate-xml-xsd) - [Converting JSON to XML in Java](https://www.baeldung.com/java-convert-json-to-xml) - [Convert an XML Object to a String in Java](https://www.baeldung.com/java-convert-xml-object-string) +- [Convert String Containing XML to org.w3c.dom.Document](https://www.baeldung.com/java-convert-string-xml-dom) From 4f98043b953827532f27fb51131def85edaeaa01 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:39:48 +0800 Subject: [PATCH 396/831] Update README.md [skip ci] --- spring-cucumber/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cucumber/README.md b/spring-cucumber/README.md index 85bc1f65d5..87623b28d4 100644 --- a/spring-cucumber/README.md +++ b/spring-cucumber/README.md @@ -4,3 +4,4 @@ This module contains articles about Spring testing with Cucumber ### Relevant Articles: - [Cucumber Spring Integration](https://www.baeldung.com/cucumber-spring-integration) +- [Overriding Cucumber Option Values](https://www.baeldung.com/java-overriding-cucumber-option-values) From 9ba05068aa4aab95407db2dd16079078f54bf750 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 5 Nov 2023 13:45:06 +0800 Subject: [PATCH 397/831] Create README.md [skip ci] --- .../src/test/java/com/baeldung/algorithms/connect4/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/README.md diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/README.md b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/README.md new file mode 100644 index 0000000000..55bc2abec5 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/connect4/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Implement Connect 4 Game with Java](https://www.baeldung.com/java-connect-4-game) From 0fc112e6134f91cf528f92bfeac4654e1742bedc Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Sun, 5 Nov 2023 02:45:44 -0300 Subject: [PATCH 398/831] BAEL 6701 - MongoDB - Atlas Search using the Java Driver and Spring Data (#15069) * research 1 * new search methods * first draft * removing old code * updated to parent-boot-3 * mongo review 2 --- .../service/MovieAtlasSearchService.java | 48 +++++++++---------- .../web/MovieAtlasSearchController.java | 4 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/service/MovieAtlasSearchService.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/service/MovieAtlasSearchService.java index 55d47759d5..90de7b3d1d 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/service/MovieAtlasSearchService.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/service/MovieAtlasSearchService.java @@ -11,13 +11,12 @@ import static com.mongodb.client.model.Projections.excludeId; import static com.mongodb.client.model.Projections.fields; import static com.mongodb.client.model.Projections.include; import static com.mongodb.client.model.Projections.metaSearchScore; +import static com.mongodb.client.model.search.SearchCollector.facet; import static com.mongodb.client.model.search.SearchCount.total; -import static com.mongodb.client.model.search.SearchFacet.combineToBson; import static com.mongodb.client.model.search.SearchFacet.numberFacet; import static com.mongodb.client.model.search.SearchFacet.stringFacet; import static com.mongodb.client.model.search.SearchOperator.compound; import static com.mongodb.client.model.search.SearchOperator.numberRange; -import static com.mongodb.client.model.search.SearchOperator.of; import static com.mongodb.client.model.search.SearchOperator.text; import static com.mongodb.client.model.search.SearchOptions.searchOptions; import static com.mongodb.client.model.search.SearchPath.fieldPath; @@ -67,7 +66,7 @@ public class MovieAtlasSearchService { builder.append("]"); LogManager.getLogger(MovieAtlasSearchService.class) - .debug(builder.toString()); + .debug(builder.toString()); } public Document late90sMovies(int skip, int limit, String keywords, SearchScore modifier) { @@ -130,7 +129,7 @@ public class MovieAtlasSearchService { debug(pipeline); return collection.aggregate(pipeline) - .first(); + .first(); } public Collection moviesByKeywords(String keywords) { @@ -150,34 +149,33 @@ public class MovieAtlasSearchService { debug(pipeline); return collection.aggregate(pipeline) - .into(new ArrayList()); + .into(new ArrayList<>()); } public Document genresThroughTheDecades(String genre) { List pipeline = asList( - searchMeta(of( - new Document("facet", - new Document("operator", - text( - fieldPath("genres"), genre - ) - ).append("facets", combineToBson(asList( - stringFacet("genresFacet", - fieldPath("genres") - ).numBuckets(5), - numberFacet("yearFacet", - fieldPath("year"), - asList(1900, 1930, 1960, 1990, 2020) - ) - ))) - )), - searchOptions() - .index(config.getFacetIndex()) + searchMeta( + facet( + text( + fieldPath("genres"), genre + ), + asList( + stringFacet("genresFacet", + fieldPath("genres") + ).numBuckets(5), + numberFacet("yearFacet", + fieldPath("year"), + asList(1900, 1930, 1960, 1990, 2020) + ) + ) + ), + searchOptions() + .index(config.getFacetIndex()) ) ); - + debug(pipeline); return collection.aggregate(pipeline) - .first(); + .first(); } } diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/web/MovieAtlasSearchController.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/web/MovieAtlasSearchController.java index 4c41915347..af8640179f 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/web/MovieAtlasSearchController.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/atlassearch/web/MovieAtlasSearchController.java @@ -1,5 +1,7 @@ package com.baeldung.boot.atlassearch.web; +import static com.mongodb.client.model.search.SearchPath.fieldPath; + import java.util.Collection; import org.bson.Document; @@ -33,7 +35,7 @@ public class MovieAtlasSearchController { @GetMapping("90s/{skip}/{limit}/with/{keywords}") Document getMoviesUsingScoreBoost(@PathVariable int skip, @PathVariable int limit, @PathVariable String keywords) { - return service.late90sMovies(skip, limit, keywords, SearchScore.boost(2)); + return service.late90sMovies(skip, limit, keywords, SearchScore.boost(fieldPath("imdb.votes"))); } @PostMapping("90s/{skip}/{limit}/with/{keywords}") From dad8f5cf2b58a7fa83e430743488a44f8ac02576 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 5 Nov 2023 11:48:26 +0530 Subject: [PATCH 399/831] JAVA-27180 Upgrade hibernate-validator version in hibernate-mapping module --- persistence-modules/hibernate-mapping/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index 1e3dc8be5f..0ce112b9e6 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -20,7 +20,7 @@ test - org.hibernate + org.hibernate.orm hibernate-core ${hibernate.version} @@ -36,7 +36,7 @@ - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -82,7 +82,7 @@ 2.1.214 6.1.7.Final 2.21.1 - 8.0.0.Final + 8.0.1.Final 3.0.1-b11 1.1 1.4.2 From a8af97e2eb5f534576447dddacc6ce8c79e206b5 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 5 Nov 2023 12:40:54 +0530 Subject: [PATCH 400/831] JAVA-27181 Update hibernate-validator version in jpa-hibarnate-cascade-type module --- .../jpa-hibernate-cascade-type/pom.xml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/persistence-modules/jpa-hibernate-cascade-type/pom.xml b/persistence-modules/jpa-hibernate-cascade-type/pom.xml index fd0ae117c7..90dd826a6e 100644 --- a/persistence-modules/jpa-hibernate-cascade-type/pom.xml +++ b/persistence-modules/jpa-hibernate-cascade-type/pom.xml @@ -24,27 +24,15 @@ - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} - - javax.el - javax.el-api - ${javax.el-api.version} - - - org.glassfish - javax.el - ${org.glassfish.javax.el.version} - 5.4.3.Final - 6.0.17.Final - 3.0.0 - 3.0.1-b11 + 8.0.1.Final \ No newline at end of file From 9e0b0945f7820d8e431b44c49f3a47a2d70be952 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 5 Nov 2023 13:05:01 +0530 Subject: [PATCH 401/831] JAVA-27182 Upgrade hibernate-validator version in spring-data-couchbase-2 module --- persistence-modules/spring-data-couchbase-2/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml index deb7d3b524..45462d477e 100644 --- a/persistence-modules/spring-data-couchbase-2/pom.xml +++ b/persistence-modules/spring-data-couchbase-2/pom.xml @@ -40,7 +40,7 @@ - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -71,7 +71,7 @@ 6.0.6 5.0.3 - 8.0.0.Final + 8.0.1.Final 2.12.2 From a575de93b1025cf723f87f98ebbbfe45bc2a6952 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 5 Nov 2023 13:36:30 +0530 Subject: [PATCH 402/831] JAVA-27183 Upgrade hibernate-validator version in spring-jpa module --- persistence-modules/spring-jpa/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index c08e4f823a..10e44c0ce4 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -71,7 +71,7 @@ - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -122,7 +122,7 @@ 6.0.0 - 8.0.0.Final + 8.0.1.Final 2.0.2 2.1.214 5.0.0 From a33bdf8a0309c30597d8e1ba7c7bc4672085d341 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sun, 5 Nov 2023 11:37:03 +0000 Subject: [PATCH 403/831] Use String over Object for unit tests --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 30 +++++ ...eturnFirstNonNullLazyEvaluateUnitTest.java | 79 +++++++++++++ .../ReturnFirstNonNullUnitTest.java | 79 +++++++++++++ .../ReturnFirstNonEmptyOptionalUnitTest.java | 37 ------ ...eturnFirstNonNullLazyEvaluateUnitTest.java | 69 ----------- .../ReturnFirstNonNullUnitTest.java | 108 ------------------ 6 files changed, 188 insertions(+), 214 deletions(-) create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java delete mode 100644 core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java new file mode 100644 index 0000000000..d855959f51 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.returnfirstnonempty; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ReturnFirstNonEmptyOptionalUnitTest { + + private List> optionals; + + @BeforeEach + public void init() { + optionals = Arrays.asList(Optional. empty(), Optional.of("first non null"), Optional.of("second non null")); + } + + @Test + public void givenListOfOptionals_thenReturnFirstNonEmpty() { + Optional object = optionals.stream() + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); + + assertThat(object).contains("first non null"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java new file mode 100644 index 0000000000..f6bf6adbdc --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.returnfirstnonnull; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.apache.commons.lang3.ObjectUtils; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockito.Spy; + +public class ReturnFirstNonNullLazyEvaluateUnitTest { + + @Spy + private final LazyEvaluate spy = Mockito.spy(new LazyEvaluate()); + + @Test + public void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { + String object = spy.methodA(); + if (object == null) { + object = spy.methodB(); + } + + if (object == null) { + object = spy.methodC(); + } + + assertEquals("first non null", object); + verify(spy, times(1)).methodA(); + verify(spy, times(1)).methodB(); + verify(spy, times(0)).methodC(); + } + + @Test + public void givenChainOfMethods_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + String object = ObjectUtils.getFirstNonNull(spy::methodA, spy::methodB, spy::methodC); + + assertEquals("first non null", object); + verify(spy, times(1)).methodA(); + verify(spy, times(1)).methodB(); + verify(spy, times(0)).methodC(); + } + + @Test + public void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { + Optional object = Stream.> of(spy::methodA, spy::methodB, spy::methodC) + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst(); + + assertThat(object).contains("first non null"); + verify(spy, times(1)).methodA(); + verify(spy, times(1)).methodB(); + verify(spy, times(0)).methodC(); + } + + @Test + public void givenNonNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + String nonNullObject = spy.methodB(); + String object = ObjectUtils.getIfNull(nonNullObject, spy::methodC); + + assertEquals("first non null", object); + verify(spy, times(0)).methodC(); + } + + @Test + public void givenNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + String nullObject = null; + String object = ObjectUtils.getIfNull(nullObject, spy::methodB); + + assertEquals("first non null", object); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java new file mode 100644 index 0000000000..19b25d3265 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.returnfirstnonnull; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.apache.commons.lang3.ObjectUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; + +public class ReturnFirstNonNullUnitTest { + + private List objects; + + @BeforeEach + public void init() { + objects = Arrays.asList(null, "first non null", "second nun null"); + } + + @Test + public void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { + Optional object = objects.stream() + .filter(o -> o != null) + .findFirst(); + + assertThat(object).contains("first non null"); + } + + @Test + public void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { + Optional object = objects.stream() + .filter(Objects::nonNull) + .findFirst(); + + assertThat(object).contains("first non null"); + } + + @Test + public void givenListOfObjects_whenIteratingWithForLoop_thenReturnFirstNonNull() { + String object = null; + for (int i = 0; i < objects.size(); i++) { + if (objects.get(i) != null) { + object = objects.get(i); + break; + } + } + + assertEquals("first non null", object); + } + + @Test + public void givenListOfObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + String object = ObjectUtils.firstNonNull(objects.toArray(new String[0])); + + assertEquals("first non null", object); + } + + @Test + public void givenListOfObjects_whenUsingGoogleGuavaIterables_thenReturnFirstNonNull() { + String object = Iterables.find(objects, Predicates.notNull()); + + assertEquals("first non null", object); + } + + @Test + public void givenTwoObjects_whenUsingGoogleGuavaMoreObjects_thenReturnFirstNonNull() { + String object = MoreObjects.firstNonNull(null, "first non null"); + + assertEquals("first non null", object); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java deleted file mode 100644 index 439cae6235..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package returnfirstnonempty; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class ReturnFirstNonEmptyOptionalUnitTest { - - private List> optionals; - - @Before - public void init() { - optionals = Arrays.asList( - Optional.empty(), - Optional.of(new Object()), - Optional.empty() - ); - } - - @Test - public void givenListOfOptionals_thenReturnFirstNonEmpty() { - Object object = optionals - .stream() - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); - - assertTrue(object != null); - assertEquals(optionals.get(1), object); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java deleted file mode 100644 index 4064ec612c..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package returnfirstnonull; - -import java.util.Objects; -import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import org.apache.commons.lang3.ObjectUtils; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class ReturnFirstNonNullLazyEvaluateUnitTest { - - private static Object METHOD_B_OBJECT = new Object(); - - private Object methodA() { return null; } - - private Object methodB() { return METHOD_B_OBJECT; } - - private Object methodC() { return null; } - - @Test - public void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { - Object object = methodA(); - if(object == null) - object = methodB(); - - if(object == null) - object = methodC(); - - assertTrue(object != null); - assertEquals(METHOD_B_OBJECT, object); - } - - @Test - public void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { - Optional object = Stream - .>of( - this::methodA, - this::methodB, - this::methodC) - .map(Supplier::get) - .filter(Objects::nonNull) - .findFirst(); - - assertTrue(object.isPresent()); - assertEquals(METHOD_B_OBJECT, object.get()); - } - - @Test - public void givenNullableObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { - Object object1 = null; - Object object = ObjectUtils.getIfNull(object1, this::methodB); - - assertTrue(object != null); - assertEquals(METHOD_B_OBJECT, object); - } - - @Test - public void givenChainOfMethods_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { - Object object = ObjectUtils.getFirstNonNull(this::methodA, this::methodB, this::methodC); - - assertTrue(object != null); - assertEquals(METHOD_B_OBJECT, object); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java deleted file mode 100644 index ddf3a131da..0000000000 --- a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package returnfirstnonull; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import org.apache.commons.lang3.ObjectUtils; - -import org.junit.Before; -import org.junit.Test; - -import com.google.common.base.MoreObjects; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class ReturnFirstNonNullUnitTest { - - private List objects; - - @Before - public void init() { - objects = Arrays.asList( - null, - new Object(), - new Object() - ); - } - - @Test - public void givenListOfObjects_whenIteratingWithForLoop_thenReturnFirstNonNull() { - Object object = null; - for(int i = 0; i < objects.size(); i++) { - if(objects.get(i) != null) { - object = objects.get(i); - break; - } - } - - assertTrue(object != null); - assertEquals(objects.get(1), object); - } - - @Test - public void givenListOfObjects_whenIteratingWithEnhancedForLoop_thenReturnFirstNonNull() { - Object object = null; - for(Object o: objects) { - if(o != null) { - object = o; - break; - } - } - - assertTrue(object != null); - assertEquals(objects.get(1), object); - } - - @Test - public void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { - Optional object = objects - .stream() - .filter(o -> o != null) - .findFirst(); - - assertTrue(object.isPresent()); - assertEquals(objects.get(1), object.get()); - } - - @Test - public void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { - Optional object = objects - .stream() - .filter(Objects::nonNull) - .findFirst(); - - assertTrue(object.isPresent()); - assertEquals(objects.get(1), object.get()); - } - - @Test - public void givenListOfObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { - Object object = ObjectUtils.firstNonNull(objects.toArray()); - - assertTrue(object != null); - assertEquals(objects.get(1), object); - } - - @Test - public void givenTwoObjects_whenUsingGoogleGuava_thenReturnFirstNonNull() { - Object object1 = null; - Object object2 = new Object(); - Object object = MoreObjects.firstNonNull(object1, object2); - - assertTrue(object != null); - assertEquals(object2, object); - } - - @Test - public void givenListOfObjects_whenUsingGoogleGuava_thenReturnFirstNonNull() { - Object object = Iterables.find(objects, Predicates.notNull()); - - assertTrue(object != null); - assertEquals(objects.get(1), object); - } -} \ No newline at end of file From 88a92d399cb7d48c687f735d607c10d1af4dc070 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sun, 5 Nov 2023 11:43:32 +0000 Subject: [PATCH 404/831] Add LazyEvaluate class --- .../returnfirstnonnull/LazyEvaluate.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/main/java/com/baeldung/returnfirstnonnull/LazyEvaluate.java diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/returnfirstnonnull/LazyEvaluate.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/returnfirstnonnull/LazyEvaluate.java new file mode 100644 index 0000000000..faa6cce465 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/returnfirstnonnull/LazyEvaluate.java @@ -0,0 +1,16 @@ +package com.baeldung.returnfirstnonnull; + +class LazyEvaluate { + + String methodA() { + return null; + } + + String methodB() { + return "first non null"; + } + + String methodC() { + return "second non null"; + } +} \ No newline at end of file From 8f01f4545564109b63595f2f3aaa490d6f70e4b5 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:06:33 +0000 Subject: [PATCH 405/831] Modify givenTwoObjects_whenUsingGoogleGuavaMoreObjects_thenReturnFirstNonNull() unit test to have two extra local variables for readability --- .../returnfirstnonnull/ReturnFirstNonNullUnitTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java index 19b25d3265..f99a8cb419 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -72,7 +72,9 @@ public class ReturnFirstNonNullUnitTest { @Test public void givenTwoObjects_whenUsingGoogleGuavaMoreObjects_thenReturnFirstNonNull() { - String object = MoreObjects.firstNonNull(null, "first non null"); + String nullObject = null; + String nonNullObject = "first non null"; + String object = MoreObjects.firstNonNull(nullObject, nonNullObject); assertEquals("first non null", object); } From a8e298e3898c9d298bff410aca0903898307aab7 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sun, 5 Nov 2023 20:11:49 +0000 Subject: [PATCH 406/831] Modify Optional value to be more descriptive --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java index d855959f51..c432af6591 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -15,7 +15,7 @@ public class ReturnFirstNonEmptyOptionalUnitTest { @BeforeEach public void init() { - optionals = Arrays.asList(Optional. empty(), Optional.of("first non null"), Optional.of("second non null")); + optionals = Arrays.asList(Optional. empty(), Optional.of("first non empty"), Optional.of("second non empty")); } @Test @@ -25,6 +25,6 @@ public class ReturnFirstNonEmptyOptionalUnitTest { .map(Optional::get) .findFirst(); - assertThat(object).contains("first non null"); + assertThat(object).contains("first non empty"); } } \ No newline at end of file From 790ec2b7fb71711ab9a8c793b6d101ac3e27cae8 Mon Sep 17 00:00:00 2001 From: timis1 Date: Sun, 5 Nov 2023 23:27:26 +0200 Subject: [PATCH 407/831] JAVA-27237 Review log statements for projects - Week 16 - 2023 (moved-13) (conti-1) --- .../test/resources/META-INF/persistence.xml | 2 +- .../src/test/resources/logback-test.xml | 2 +- .../src/test/resources/logback-test.xml | 2 ++ .../config/src/main/resources/logback.xml | 6 ++++++ .../src/main/resources/logback.xml | 18 +++++++++++++++++ .../src/main/resources/logback.xml | 20 +++++++++++++++++++ .../src/test/resources/logback-test.xml | 6 ++++++ 7 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml create mode 100644 spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-echo-demo/src/main/resources/logback.xml diff --git a/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml b/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml index ffcf20878c..60b415abd7 100644 --- a/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml +++ b/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml @@ -35,7 +35,7 @@ - + diff --git a/persistence-modules/deltaspike/src/test/resources/logback-test.xml b/persistence-modules/deltaspike/src/test/resources/logback-test.xml index bdc292924b..6a9aa37e7f 100644 --- a/persistence-modules/deltaspike/src/test/resources/logback-test.xml +++ b/persistence-modules/deltaspike/src/test/resources/logback-test.xml @@ -7,7 +7,7 @@ - + diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/logback-test.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/logback-test.xml index 8d4771e308..b9242f40a8 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/logback-test.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-basic-config/src/test/resources/logback-test.xml @@ -6,6 +6,8 @@ + + diff --git a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml index 7d900d8ea8..896eaf9c88 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/config/src/main/resources/logback.xml @@ -7,6 +7,12 @@ + + + + + + diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml new file mode 100644 index 0000000000..d944288ca4 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-echo-demo/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-echo-demo/src/main/resources/logback.xml new file mode 100644 index 0000000000..5f3e764e22 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-echo-demo/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-jenkins-pipeline/src/test/resources/logback-test.xml b/spring-jenkins-pipeline/src/test/resources/logback-test.xml index b9242f40a8..69ab60701a 100644 --- a/spring-jenkins-pipeline/src/test/resources/logback-test.xml +++ b/spring-jenkins-pipeline/src/test/resources/logback-test.xml @@ -8,6 +8,12 @@ + + + + + + From 63953b74f3cef3f6989bffa257ec32e0578c64fc Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Mon, 6 Nov 2023 02:26:25 +0100 Subject: [PATCH 408/831] Nth substring (#15120) * [nth-substring] nth substring in a string * [nth-substring] find n-th substring --- .../FindNthSubstringIndexUnitTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nthsubstring/FindNthSubstringIndexUnitTest.java diff --git a/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nthsubstring/FindNthSubstringIndexUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nthsubstring/FindNthSubstringIndexUnitTest.java new file mode 100644 index 0000000000..779585ffb0 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/nthsubstring/FindNthSubstringIndexUnitTest.java @@ -0,0 +1,106 @@ +package com.baeldung.nthsubstring; + +import org.junit.jupiter.api.Test; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FindNthSubstringIndexUnitTest { + // "0 8 16 24 " + private final static String INPUT = "a word, a word, a word, a word"; + + @Test + void whenCallingIndexOfTwice_thenGetTheSecondSubstringIndex() { + int firstIdx = INPUT.indexOf("a"); + int result = INPUT.indexOf("a", firstIdx + "a".length()); + assertEquals(8, result); + } + + // the recursive approach + static int nthIndexOf(String input, String substring, int nth) { + if (nth == 1) { + return input.indexOf(substring); + } else { + return input.indexOf(substring, nthIndexOf(input, substring, nth - 1) + substring.length()); + } + } + + @Test + void whenCallingRecursiveMethod_thenGetTheExpectedResult() { + int result1 = nthIndexOf(INPUT, "a", 1); + assertEquals(0, result1); + + int result2 = nthIndexOf(INPUT, "a", 2); + assertEquals(8, result2); + + int result3 = nthIndexOf(INPUT, "a", 3); + assertEquals(16, result3); + + int result4 = nthIndexOf(INPUT, "a", 4); + assertEquals(24, result4); + + int result5 = nthIndexOf(INPUT, "a", 5); + assertEquals(-1, result5); + } + + // loop-based approach + static int nthIndexOf2(String input, String substring, int nth) { + int index = -1; + while (nth > 0) { + index = input.indexOf(substring, index + substring.length()); + if (index == -1) { + return -1; + } + nth--; + } + return index; + } + + @Test + void whenCallingLoopBasedMethod_thenGetTheExpectedResult() { + int result1 = nthIndexOf2(INPUT, "a", 1); + assertEquals(0, result1); + + int result2 = nthIndexOf2(INPUT, "a", 2); + assertEquals(8, result2); + + int result3 = nthIndexOf2(INPUT, "a", 3); + assertEquals(16, result3); + + int result4 = nthIndexOf2(INPUT, "a", 4); + assertEquals(24, result4); + + int result5 = nthIndexOf2(INPUT, "a", 5); + assertEquals(-1, result5); + } + + static int nthOccurrenceIndex(String input, String regexPattern, int nth) { + Matcher matcher = Pattern.compile(regexPattern).matcher(INPUT); + for (int i = 0; i < nth; i++) { + if (!matcher.find()) { + return -1; + } + } + return matcher.start(); + } + + @Test + void whenCallingRegexBasedMethod_thenGetTheExpectedResult() { + int result1 = nthOccurrenceIndex(INPUT, "a", 1); + assertEquals(0, result1); + + int result2 = nthOccurrenceIndex(INPUT, "a", 2); + assertEquals(8, result2); + + int result3 = nthOccurrenceIndex(INPUT, "a", 3); + assertEquals(16, result3); + + int result4 = nthOccurrenceIndex(INPUT, "a", 4); + assertEquals(24, result4); + + int result5 = nthOccurrenceIndex(INPUT, "a", 5); + assertEquals(-1, result5); + } +} \ No newline at end of file From da8167cf17cd23cc083853ae286bd836d686984d Mon Sep 17 00:00:00 2001 From: Rajat Garg Date: Mon, 6 Nov 2023 07:15:53 +0530 Subject: [PATCH 409/831] [BAEL-7069] Pass list as a query parameter in Jersey (#15051) * Pass list as a query parameter in Jersey * Address review comment * Address review comment --------- Co-authored-by: rajatgarg --- .../client/listdemo/JerseyListDemo.java | 15 +++++ .../jersey/client/listdemo/ListDemoApp.java | 9 +++ .../listdemo/JerseyListDemoUnitTest.java | 57 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 jersey/src/main/java/com/baeldung/jersey/client/listdemo/JerseyListDemo.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/client/listdemo/ListDemoApp.java create mode 100644 jersey/src/test/java/com/baeldung/jersey/client/listdemo/JerseyListDemoUnitTest.java diff --git a/jersey/src/main/java/com/baeldung/jersey/client/listdemo/JerseyListDemo.java b/jersey/src/main/java/com/baeldung/jersey/client/listdemo/JerseyListDemo.java new file mode 100644 index 0000000000..52be341653 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/listdemo/JerseyListDemo.java @@ -0,0 +1,15 @@ +package com.baeldung.jersey.client.listdemo; + +import java.util.List; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; + +@Path("/") +public class JerseyListDemo { + @GET + public String getItems(@QueryParam("items") List items) { + return "Received items: " + items; + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/client/listdemo/ListDemoApp.java b/jersey/src/main/java/com/baeldung/jersey/client/listdemo/ListDemoApp.java new file mode 100644 index 0000000000..7f5be883da --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/listdemo/ListDemoApp.java @@ -0,0 +1,9 @@ +package com.baeldung.jersey.client.listdemo; + +import org.glassfish.jersey.server.ResourceConfig; + +public class ListDemoApp extends ResourceConfig { + public ListDemoApp() { + packages("com.baeldung.jersey.client.listdemo"); + } +} diff --git a/jersey/src/test/java/com/baeldung/jersey/client/listdemo/JerseyListDemoUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/client/listdemo/JerseyListDemoUnitTest.java new file mode 100644 index 0000000000..0aff6dcabf --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/client/listdemo/JerseyListDemoUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.jersey.client.listdemo; + +import static org.junit.Assert.assertEquals; + +import java.net.URI; +import java.util.Arrays; +import java.util.List; + +import org.glassfish.jersey.test.JerseyTest; +import org.glassfish.jersey.test.TestProperties; +import org.junit.Test; + +import jakarta.ws.rs.core.Application; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriBuilder; + +public class JerseyListDemoUnitTest extends JerseyTest { + + @Override + protected Application configure() { + enable(TestProperties.LOG_TRAFFIC); + enable(TestProperties.DUMP_ENTITY); + return new ListDemoApp(); + } + + @Test + public void givenList_whenUsingQueryParam_thenPassParamsAsList() { + Response response = target("/") + .queryParam("items", "item1", "item2") + .request() + .get(); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + assertEquals("Received items: [item1, item2]", response.readEntity(String.class)); + } + + @Test + public void givenList_whenUsingCommaSeparatedString_thenPassParamsAsList() { + Response response = target("/") + .queryParam("items", "item1,item2") + .request() + .get(); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); + assertEquals("Received items: [item1,item2]", response.readEntity(String.class)); + } + + @Test + public void givenList_whenUsingUriBuilder_thenPassParamsAsList() { + List itemsList = Arrays.asList("item1", "item2"); + UriBuilder builder = UriBuilder.fromUri("/"); + for (String item : itemsList) { + builder.queryParam("items", item); + } + URI uri = builder.build(); + String expectedUri = "/?items=item1&items=item2"; + assertEquals(expectedUri, uri.toString()); + } +} From 5d3f08d0e915ca8b077666253fa4b3899475155c Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 5 Nov 2023 21:32:49 -0500 Subject: [PATCH 410/831] Fix the whitespace and newline issues - wuth code formatter --- .../message/ordering/payload/UserEvent.java | 3 ++- .../serialization/JacksonDeserializer.java | 3 ++- .../serialization/JacksonSerializer.java | 1 + ...SequenceWithTimeWindowIntegrationTest.java | 22 ++++++++++++------- .../MultiplePartitionIntegrationTest.java | 14 ++++++++---- .../SinglePartitionIntegrationTest.java | 19 +++++++++------- 6 files changed, 40 insertions(+), 22 deletions(-) diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java index 676b469ce8..99e0cc6c7e 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/payload/UserEvent.java @@ -1,13 +1,14 @@ package com.baeldung.kafka.message.ordering.payload; import java.util.Objects; + public class UserEvent implements Comparable { private String userEventId; private long eventNanoTime; private long globalSequenceNumber; @SuppressWarnings("unused") - public UserEvent(){ + public UserEvent() { // Required for Jackson Serialization and Deserialization } diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java index 4868ecaf2e..cf72ab12df 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonDeserializer.java @@ -1,6 +1,8 @@ package com.baeldung.kafka.message.ordering.serialization; + import com.baeldung.kafka.message.ordering.Config; import com.fasterxml.jackson.databind.ObjectMapper; + import org.apache.kafka.common.serialization.Deserializer; import java.util.Map; @@ -12,7 +14,6 @@ public class JacksonDeserializer implements Deserializer { private final ObjectMapper objectMapper = new ObjectMapper(); private Class type; - @Override public void configure(Map configs, boolean isKey) { this.type = (Class) configs.get(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS); diff --git a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java index 4c081de3cc..b2ace3b8ed 100644 --- a/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java +++ b/apache-kafka-2/src/main/java/com/baeldung/kafka/message/ordering/serialization/JacksonSerializer.java @@ -1,6 +1,7 @@ package com.baeldung.kafka.message.ordering.serialization; import com.fasterxml.jackson.databind.ObjectMapper; + import org.apache.kafka.common.serialization.Serializer; /** diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java index a5ec7a98a3..caffe12620 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java @@ -4,6 +4,7 @@ import com.baeldung.kafka.headers.KafkaMessageHeaders; import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; + import org.apache.kafka.clients.admin.*; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; @@ -23,11 +24,14 @@ import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.DockerImageName; + import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import com.google.common.collect.ImmutableList; + import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers @@ -37,8 +41,8 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { private static KafkaProducer producer; private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); - private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5).toNanos(); - + private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5) + .toNanos(); private static Logger logger = LoggerFactory.getLogger(ExternalSequenceWithTimeWindowIntegrationTest.class); @Container @@ -66,7 +70,9 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); - admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))).all().get(); + admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))) + .all() + .get(); } @AfterAll @@ -78,8 +84,9 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { void givenMultiplePartitions_whenPublishedToKafkaAndConsumedWithExtSeqNumberAndTimeWindow_thenCheckForMessageOrder() throws ExecutionException, InterruptedException { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); - for (long sequenceNumber = 1; sequenceNumber <= 10 ; sequenceNumber++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + for (long sequenceNumber = 1; sequenceNumber <= 10; sequenceNumber++) { + UserEvent userEvent = new UserEvent(UUID.randomUUID() + .toString()); userEvent.setEventNanoTime(System.nanoTime()); userEvent.setGlobalSequenceNumber(sequenceNumber); Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); @@ -105,9 +112,8 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { buffer.add(record.value()); }); } - assertThat(receivedUserEventList) - .isEqualTo(sentUserEventList) - .containsExactlyElementsOf(sentUserEventList); + assertThat(receivedUserEventList).isEqualTo(sentUserEventList) + .containsExactlyElementsOf(sentUserEventList); } private static void processBuffer(List buffer, List receivedUserEventList) { diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java index adfa9a0399..bb25486f00 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; + import org.apache.kafka.clients.admin.*; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecords; @@ -22,11 +23,14 @@ import org.testcontainers.containers.KafkaContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.DockerImageName; + import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import com.google.common.collect.ImmutableList; + import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers @@ -63,7 +67,9 @@ public class MultiplePartitionIntegrationTest { admin = Admin.create(adminProperties); producer = new KafkaProducer<>(producerProperties); consumer = new KafkaConsumer<>(consumerProperties); - admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))).all().get(); + admin.createTopics(ImmutableList.of(new NewTopic(Config.MULTI_PARTITION_TOPIC, Config.MULTIPLE_PARTITIONS, Config.REPLICATION_FACTOR))) + .all() + .get(); } @AfterAll @@ -76,7 +82,8 @@ public class MultiplePartitionIntegrationTest { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); for (long sequenceNumber = 1; sequenceNumber <= 10; sequenceNumber++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + UserEvent userEvent = new UserEvent(UUID.randomUUID() + .toString()); userEvent.setGlobalSequenceNumber(sequenceNumber); userEvent.setEventNanoTime(System.nanoTime()); Future future = producer.send(new ProducerRecord<>(Config.MULTI_PARTITION_TOPIC, sequenceNumber, userEvent)); @@ -92,8 +99,7 @@ public class MultiplePartitionIntegrationTest { receivedUserEventList.add(userEvent); logger.info("User Event ID: " + userEvent.getUserEventId()); }); - assertThat(receivedUserEventList) - .isNotEqualTo(sentUserEventList) + assertThat(receivedUserEventList).isNotEqualTo(sentUserEventList) .containsExactlyInAnyOrderElementsOf(sentUserEventList); } } diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java index 7280a1218a..8656df1bf3 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.kafka.message.ordering; import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; + import org.apache.kafka.clients.admin.Admin; import org.apache.kafka.clients.admin.AdminClientConfig; import org.apache.kafka.clients.admin.NewTopic; @@ -29,7 +30,9 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import com.google.common.collect.ImmutableList; + import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers @@ -56,7 +59,6 @@ public class SinglePartitionIntegrationTest { producerProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); producerProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, LongSerializer.class.getName()); producerProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JacksonSerializer.class.getName()); - producer = new KafkaProducer<>(producerProperties); Properties consumerProperties = new Properties(); consumerProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_CONTAINER.getBootstrapServers()); @@ -65,11 +67,12 @@ public class SinglePartitionIntegrationTest { consumerProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); consumerProperties.put(Config.CONSUMER_VALUE_DESERIALIZER_SERIALIZED_CLASS, UserEvent.class); consumerProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); - consumer = new KafkaConsumer<>(consumerProperties); admin = Admin.create(adminProperties); - - - admin.createTopics(ImmutableList.of(new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR))).all().get(); + producer = new KafkaProducer<>(producerProperties); + consumer = new KafkaConsumer<>(consumerProperties); + admin.createTopics(ImmutableList.of(new NewTopic(Config.SINGLE_PARTITION_TOPIC, Config.SINGLE_PARTITION, Config.REPLICATION_FACTOR))) + .all() + .get(); } @AfterAll @@ -82,7 +85,8 @@ public class SinglePartitionIntegrationTest { List sentUserEventList = new ArrayList<>(); List receivedUserEventList = new ArrayList<>(); for (long sequenceNumber = 1; sequenceNumber <= 10; sequenceNumber++) { - UserEvent userEvent = new UserEvent(UUID.randomUUID().toString()); + UserEvent userEvent = new UserEvent(UUID.randomUUID() + .toString()); userEvent.setGlobalSequenceNumber(sequenceNumber); userEvent.setEventNanoTime(System.nanoTime()); ProducerRecord producerRecord = new ProducerRecord<>(Config.SINGLE_PARTITION_TOPIC, userEvent); @@ -99,8 +103,7 @@ public class SinglePartitionIntegrationTest { receivedUserEventList.add(userEvent); logger.info("User Event ID: " + userEvent.getUserEventId()); }); - assertThat(receivedUserEventList) - .isEqualTo(sentUserEventList) + assertThat(receivedUserEventList).isEqualTo(sentUserEventList) .containsExactlyElementsOf(sentUserEventList); } } From 6e758b8438de2bd367ccf741fa2a53a01c9399ec Mon Sep 17 00:00:00 2001 From: Amol Gote Date: Sun, 5 Nov 2023 21:39:02 -0500 Subject: [PATCH 411/831] The test names should be LiveTest not IntegrationTest, as per the other similar tests in this module. This naming is used to mark these tests as manually runnable only, since they are heavy tests that spin up a container, so we don't want them to be run as part of the automatic CI build. Same for the other tests. --- ...Test.java => ExternalSequenceWithTimeWindowLiveTest.java} | 5 ++--- ...onIntegrationTest.java => MultiplePartitionLiveTest.java} | 4 ++-- ...tionIntegrationTest.java => SinglePartitionLiveTest.java} | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{ExternalSequenceWithTimeWindowIntegrationTest.java => ExternalSequenceWithTimeWindowLiveTest.java} (97%) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{MultiplePartitionIntegrationTest.java => MultiplePartitionLiveTest.java} (98%) rename apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/{SinglePartitionIntegrationTest.java => SinglePartitionLiveTest.java} (98%) diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowLiveTest.java similarity index 97% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowLiveTest.java index caffe12620..f36c6ebd63 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/ExternalSequenceWithTimeWindowLiveTest.java @@ -1,6 +1,5 @@ package com.baeldung.kafka.message.ordering; -import com.baeldung.kafka.headers.KafkaMessageHeaders; import com.baeldung.kafka.message.ordering.payload.UserEvent; import com.baeldung.kafka.message.ordering.serialization.JacksonDeserializer; import com.baeldung.kafka.message.ordering.serialization.JacksonSerializer; @@ -35,7 +34,7 @@ import com.google.common.collect.ImmutableList; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers -public class ExternalSequenceWithTimeWindowIntegrationTest { +public class ExternalSequenceWithTimeWindowLiveTest { private static Admin admin; private static KafkaProducer producer; @@ -43,7 +42,7 @@ public class ExternalSequenceWithTimeWindowIntegrationTest { private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); private static final long BUFFER_PERIOD_NS = Duration.ofSeconds(5) .toNanos(); - private static Logger logger = LoggerFactory.getLogger(ExternalSequenceWithTimeWindowIntegrationTest.class); + private static Logger logger = LoggerFactory.getLogger(ExternalSequenceWithTimeWindowLiveTest.class); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionLiveTest.java similarity index 98% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionLiveTest.java index bb25486f00..407b4d52a9 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/MultiplePartitionLiveTest.java @@ -34,14 +34,14 @@ import com.google.common.collect.ImmutableList; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers -public class MultiplePartitionIntegrationTest { +public class MultiplePartitionLiveTest { private static Admin admin; private static KafkaProducer producer; private static KafkaConsumer consumer; private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); - private static Logger logger = LoggerFactory.getLogger(MultiplePartitionIntegrationTest.class); + private static Logger logger = LoggerFactory.getLogger(MultiplePartitionLiveTest.class); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); diff --git a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionLiveTest.java similarity index 98% rename from apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java rename to apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionLiveTest.java index 8656df1bf3..9c6a15ebeb 100644 --- a/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionIntegrationTest.java +++ b/apache-kafka-2/src/test/java/com/baeldung/kafka/message/ordering/SinglePartitionLiveTest.java @@ -36,7 +36,7 @@ import com.google.common.collect.ImmutableList; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @Testcontainers -public class SinglePartitionIntegrationTest { +public class SinglePartitionLiveTest { private static Admin admin; private static KafkaProducer producer; @@ -44,7 +44,7 @@ public class SinglePartitionIntegrationTest { private static final Duration TIMEOUT_WAIT_FOR_MESSAGES = Duration.ofSeconds(5); - private static Logger logger = LoggerFactory.getLogger(SinglePartitionIntegrationTest.class); + private static Logger logger = LoggerFactory.getLogger(SinglePartitionLiveTest.class); @Container private static final KafkaContainer KAFKA_CONTAINER = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")); From c61a1dace10bd3848290088204c36f1d5ed79dc5 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 6 Nov 2023 12:24:02 +0530 Subject: [PATCH 412/831] BAEL-7091 Asserting Nested Map with JUnit --- testing-modules/hamcrest/pom.xml | 12 +++ .../AssertNestedMapUnitTest.java | 94 +++++++++++++++++++ .../matchers/NestedMapMatcher.java | 38 ++++++++ 3 files changed, 144 insertions(+) create mode 100644 testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java create mode 100644 testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml index df8c543edb..b5a8277deb 100644 --- a/testing-modules/hamcrest/pom.xml +++ b/testing-modules/hamcrest/pom.xml @@ -6,6 +6,18 @@ hamcrest 0.0.1-SNAPSHOT hamcrest + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + jar diff --git a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java new file mode 100644 index 0000000000..42c225695c --- /dev/null +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java @@ -0,0 +1,94 @@ +package com.baeldung.hamcrest.assertnestedmap; + + +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static com.baeldung.hamcrest.assertnestedmap.matchers.NestedMapMatcher.hasNestedMapEntry; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; + +public class AssertNestedMapUnitTest { + + @Test + void givenNestedMap_whenUseJupiterAssertTrueWithoutCasting_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); + + assertTrue(outerMap.containsKey("address") && outerMap.get("address").get("city").equals("Chicago")); + } + + @Test + void givenNestedMap_whenUseJupiterAssertAllAndAssertTrue_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); + + assertAll( + () -> assertTrue(outerMap.containsKey("address")), + () -> assertEquals(outerMap.get("address").get("city"), "Chicago") + ); + } + + @Test + void givenNestedMap_whenUseJupiterAssertTrueWithCasting_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map outerMap = Map.of("address", innerMap); + + assertTrue(outerMap.containsKey("address") + && ((Map)outerMap.get("address")).get("city").equals("Chicago")); + } + + @Test + void givenNestedMap_whenUseHamcrestAssertThat_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); + assertAll( + () -> assertThat(outerMap, hasKey("address")), + () -> assertThat(outerMap.get("address"), hasEntry("city", "Chicago")) + ); + } + + @Test + void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThat_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); + + assertThat(outerMap, hasEntry(equalTo("address"), hasEntry("city", "Chicago"))); + } + + @Test + void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { + Map innerMap = Map.of + ( + "city", "Chicago", + "zip", "10005" + ); + Map> outerMap = Map.of("address", innerMap); + + assertThat(outerMap, hasNestedMapEntry("address", innerMap)); + } + + @Test + void givenOuterMapOfStringAndObjectAndInnerMap_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { + Map innerMap = Map.of + ( + "city", "Chicago", + "zip", "10005" + ); + Map outerMap = Map.of("address", innerMap); + + assertThat(outerMap, hasNestedMapEntry("address", innerMap)); + } + + + @Test + void givenNestedMap_whenUseHamcrestAssertThatWithCasting_thenTest() { + Map innerMap = Map.of("city", "Chicago"); + Map outerMap = Map.of("address", innerMap); + + assertThat((Map)outerMap.get("address"), hasEntry("city", "Chicago")); + } + +} diff --git a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java new file mode 100644 index 0000000000..760edebb35 --- /dev/null +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java @@ -0,0 +1,38 @@ +package com.baeldung.hamcrest.assertnestedmap.matchers; + + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +import java.util.Map; + +public class NestedMapMatcher extends TypeSafeMatcher> { + private K key; + private V subMapValue; + + public NestedMapMatcher(K key, V subMapValue) { + this.key = key; + this.subMapValue = subMapValue; + } + + @Override + protected boolean matchesSafely(Map item) { + if (item.containsKey(key)) { + Object actualValue = item.get(key); + return subMapValue.equals(actualValue); + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("a map containing key ").appendValue(key) + .appendText(" with value ").appendValue(subMapValue); + } + + public static Matcher hasNestedMapEntry(K key, V expectedValue) { + return new NestedMapMatcher(key, expectedValue); + } +} + From 91293d64b0be2e2d1bb61d44de5fa85aa5328fee Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 6 Nov 2023 08:52:53 +0000 Subject: [PATCH 413/831] =?UTF-8?q?[JAVA-26049]=20Upgraded=20spring-boot-e?= =?UTF-8?q?nvironment=20module=20to=20spring-boot=203=E2=80=A6=20(#14994)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring-boot-environment/pom.xml | 22 +++++++++++-------- .../main/resources/META-INF/spring.factories | 6 ----- .../META-INF/spring/AutoConfiguration.imports | 1 + .../META-INF/spring/spring.factories | 3 +++ 4 files changed, 17 insertions(+), 15 deletions(-) delete mode 100644 spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring.factories create mode 100644 spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/AutoConfiguration.imports create mode 100644 spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/spring.factories diff --git a/spring-boot-modules/spring-boot-environment/pom.xml b/spring-boot-modules/spring-boot-environment/pom.xml index 4bdb35358c..9974d41f45 100644 --- a/spring-boot-modules/spring-boot-environment/pom.xml +++ b/spring-boot-modules/spring-boot-environment/pom.xml @@ -9,9 +9,10 @@ Demo project for Spring Boot - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -46,11 +47,6 @@ h2 runtime - - javax.persistence - javax.persistence-api - ${jpa.version} - com.google.guava guava @@ -96,6 +92,15 @@ + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.environmentpostprocessor.PriceCalculationApplication + + + @@ -151,7 +156,6 @@ - 2.2 3.1.7 4.5.8 2021.0.0 diff --git a/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring.factories b/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring.factories deleted file mode 100644 index c36b67f8d7..0000000000 --- a/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,6 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.baeldung.environmentpostprocessor.autoconfig.PriceCalculationAutoConfig - -org.springframework.boot.env.EnvironmentPostProcessor=\ -com.baeldung.environmentpostprocessor.PriceCalculationEnvironmentPostProcessor - diff --git a/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/AutoConfiguration.imports b/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/AutoConfiguration.imports new file mode 100644 index 0000000000..350e2efa94 --- /dev/null +++ b/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/AutoConfiguration.imports @@ -0,0 +1 @@ +com.baeldung.environmentpostprocessor.autoconfig.PriceCalculationAutoConfig diff --git a/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/spring.factories b/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/spring.factories new file mode 100644 index 0000000000..ff5e404c84 --- /dev/null +++ b/spring-boot-modules/spring-boot-environment/src/main/resources/META-INF/spring/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ +com.baeldung.environmentpostprocessor.PriceCalculationEnvironmentPostProcessor + From 81be7c4ad51e4f88a53d99dc834e8b7fd7098d80 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:45:12 +0000 Subject: [PATCH 414/831] [JAVA-26374-boot-runtime] Moved "CORS with Spring" article to spring-boot-runtime (#15096) --- spring-boot-modules/spring-boot-runtime-2/README.md | 1 - spring-boot-modules/spring-boot-runtime/README.md | 1 + .../src/main/java/com/baeldung/cors/Account.java | 0 .../src/main/java/com/baeldung/cors/AccountController.java | 0 .../src/main/java/com/baeldung/cors/config/WebConfig.java | 0 5 files changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/{spring-boot-runtime-2 => spring-boot-runtime}/src/main/java/com/baeldung/cors/Account.java (100%) rename spring-boot-modules/{spring-boot-runtime-2 => spring-boot-runtime}/src/main/java/com/baeldung/cors/AccountController.java (100%) rename spring-boot-modules/{spring-boot-runtime-2 => spring-boot-runtime}/src/main/java/com/baeldung/cors/config/WebConfig.java (100%) diff --git a/spring-boot-modules/spring-boot-runtime-2/README.md b/spring-boot-modules/spring-boot-runtime-2/README.md index f439b0d0bd..3ee05ccc83 100644 --- a/spring-boot-modules/spring-boot-runtime-2/README.md +++ b/spring-boot-modules/spring-boot-runtime-2/README.md @@ -4,5 +4,4 @@ This module contains articles about administering a Spring Boot runtime ### Relevant Articles: - [Configure the Heap Size When Starting a Spring Boot Application](https://www.baeldung.com/spring-boot-heap-size) - - [CORS with Spring](https://www.baeldung.com/spring-cors) - [Max-HTTP-Header-Size in Spring Boot 2](https://www.baeldung.com/spring-boot-max-http-header-size) diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md index 6f21efe793..6463aaa6c3 100644 --- a/spring-boot-modules/spring-boot-runtime/README.md +++ b/spring-boot-modules/spring-boot-runtime/README.md @@ -10,3 +10,4 @@ This module contains articles about administering a Spring Boot runtime - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) + - [CORS with Spring](https://www.baeldung.com/spring-cors) diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/Account.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/Account.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/Account.java rename to spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/Account.java diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/AccountController.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/AccountController.java rename to spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/config/WebConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/config/WebConfig.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/cors/config/WebConfig.java rename to spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/config/WebConfig.java From dc667e03f3b9d4b94466459fbbaec99840d51f00 Mon Sep 17 00:00:00 2001 From: timis1 Date: Mon, 6 Nov 2023 13:58:00 +0200 Subject: [PATCH 415/831] JAVA-27237 Change the logging level to WARN (spring-integration) --- spring-integration/src/test/resources/logback-test.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration/src/test/resources/logback-test.xml b/spring-integration/src/test/resources/logback-test.xml index 98bfc86d71..352dc719df 100644 --- a/spring-integration/src/test/resources/logback-test.xml +++ b/spring-integration/src/test/resources/logback-test.xml @@ -9,7 +9,7 @@ - + From fb2f90d88f540c2df051d318c8f176a643462bf0 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:08:47 +0530 Subject: [PATCH 416/831] BAEL-7177 review comments implemented. --- .../modifystream/ModifyStreamUnitTest.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java index f5fab408b8..9da3beb40e 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/modifystream/ModifyStreamUnitTest.java @@ -95,15 +95,6 @@ public class ModifyStreamUnitTest { assertEquals(3, newPersonList.size()); } - @Test - void givenPersonList_whenRemovePersonWithRemoveIf_thenPersonRemoved() { - assertEquals(4, personList.size()); - - personList.removeIf(e -> e.getName().equals("John")); - - assertEquals(3, personList.size()); - } - @Test void givenPersonList_whenUpdatePersonEmailByInterferingWithForEach_thenPersonEmailUpdated() { personList.stream().forEach(e -> e.setEmail(e.getEmail().toUpperCase())); @@ -128,11 +119,12 @@ public class ModifyStreamUnitTest { newImmutablePersonList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } + @Test void givenPersonList_whenUpdatePersonEmailByInterferingWithPeek_thenPersonEmailUpdated() { personList.stream() - .peek(e -> e.setEmail(e.getEmail().toUpperCase())) - .collect(Collectors.toList()); + .peek(e -> e.setEmail(e.getEmail().toUpperCase())) + .collect(Collectors.toList()); personList.forEach(e -> assertEquals(e.getEmail(), e.getEmail().toUpperCase())); } From e9431ce416773b07ea3efc42bc1a4cbaa783114a Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:27:07 +0530 Subject: [PATCH 417/831] BAEL-7091 Formatting fixed --- .../assertnestedmap/AssertNestedMapUnitTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java index 42c225695c..b5b4d652a0 100644 --- a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java @@ -11,7 +11,6 @@ import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; public class AssertNestedMapUnitTest { - @Test void givenNestedMap_whenUseJupiterAssertTrueWithoutCasting_thenTest() { Map innerMap = Map.of("city", "Chicago"); @@ -26,8 +25,8 @@ public class AssertNestedMapUnitTest { Map> outerMap = Map.of("address", innerMap); assertAll( - () -> assertTrue(outerMap.containsKey("address")), - () -> assertEquals(outerMap.get("address").get("city"), "Chicago") + () -> assertTrue(outerMap.containsKey("address")), + () -> assertEquals(outerMap.get("address").get("city"), "Chicago") ); } @@ -45,8 +44,8 @@ public class AssertNestedMapUnitTest { Map innerMap = Map.of("city", "Chicago"); Map> outerMap = Map.of("address", innerMap); assertAll( - () -> assertThat(outerMap, hasKey("address")), - () -> assertThat(outerMap.get("address"), hasEntry("city", "Chicago")) + () -> assertThat(outerMap, hasKey("address")), + () -> assertThat(outerMap.get("address"), hasEntry("city", "Chicago")) ); } @@ -82,7 +81,6 @@ public class AssertNestedMapUnitTest { assertThat(outerMap, hasNestedMapEntry("address", innerMap)); } - @Test void givenNestedMap_whenUseHamcrestAssertThatWithCasting_thenTest() { Map innerMap = Map.of("city", "Chicago"); From 9e3c735879388af7f39456972ed516d3518d291f Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:38:16 +0200 Subject: [PATCH 418/831] JAVA-22208 Fix port to 1030,1031 for jenkins (#15100) --- ...oadBalancerBooksClientIntegrationTest.java | 6 +++--- .../client/LoadBalancerIntegrationTest.java | 6 +++--- .../spring/cloud/client/TestConfig.java | 4 ++-- .../spring/cloud/client/WireMockConfig.java | 4 ++-- ...application-spring-cloud-balancer-test.yml | 19 ------------------- .../src/test/resources/application-test.yml | 4 ++-- 6 files changed, 12 insertions(+), 31 deletions(-) delete mode 100644 spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java index 5690c24d77..a70ae1ee22 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerBooksClientIntegrationTest.java @@ -63,12 +63,12 @@ class LoadBalancerBooksClientIntegrationTest { String serviceId = "books-service"; RoundRobinLoadBalancer loadBalancer = new RoundRobinLoadBalancer(ServiceInstanceListSuppliers - .toProvider(serviceId, instance(serviceId, "localhost", false), instance(serviceId, "localhost", true)), + .toProvider(serviceId, instance(serviceId, "localhost", 1030, false), instance(serviceId, "localhost", 1031, true)), serviceId, -1); } - private static DefaultServiceInstance instance(String serviceId, String host, boolean secure) { - return new DefaultServiceInstance(serviceId, serviceId, host, 80, secure); + private static DefaultServiceInstance instance(String serviceId, String host, int port, boolean secure) { + return new DefaultServiceInstance(serviceId, serviceId, host, port, secure); } @Test diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java index eee4e7b860..9761b4eb64 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/LoadBalancerIntegrationTest.java @@ -80,13 +80,13 @@ class LoadBalancerIntegrationTest { void staticConfigurationWorks() { String serviceId = "test-book-service"; RoundRobinLoadBalancer loadBalancer = new RoundRobinLoadBalancer(ServiceInstanceListSuppliers - .toProvider(serviceId, instance(serviceId, "bookservice1", false), instance(serviceId, "bookservice2", false)), + .toProvider(serviceId, instance(serviceId, "bookservice1", 1030, false), instance(serviceId, "bookservice2", 1031, false)), serviceId, -1); assertLoadBalancer(loadBalancer, Arrays.asList("bookservice1", "bookservice2")); } - private static DefaultServiceInstance instance(String serviceId, String host, boolean secure) { - return new DefaultServiceInstance(serviceId, serviceId, host, 80, secure); + private static DefaultServiceInstance instance(String serviceId, String host, int port, boolean secure) { + return new DefaultServiceInstance(serviceId, serviceId, host, port, secure); } @EnableAutoConfiguration diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java index b3770721b1..375c945054 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/TestConfig.java @@ -14,11 +14,11 @@ public class TestConfig { @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockBooksService() { - return new WireMockServer(options().port(80)); + return new WireMockServer(options().port(1030)); } @Bean(name="secondMockBooksService", initMethod = "start", destroyMethod = "stop") public WireMockServer secondBooksMockService() { - return new WireMockServer(options().port(81)); + return new WireMockServer(options().port(1031)); } } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java index 3d4f2822f4..a41faa9c5c 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/java/com/baeldung/spring/cloud/client/WireMockConfig.java @@ -11,11 +11,11 @@ public class WireMockConfig { @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockBooksService() { - return new WireMockServer(80); + return new WireMockServer(1030); } @Bean(initMethod = "start", destroyMethod = "stop") public WireMockServer mockBooksService2() { - return new WireMockServer(81); + return new WireMockServer(1031); } } diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml deleted file mode 100644 index ad11d46ae8..0000000000 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-spring-cloud-balancer-test.yml +++ /dev/null @@ -1,19 +0,0 @@ -eureka: - client: - enabled: false - -spring: - application: - name: books-service - cloud: - loadbalancer: - ribbon: - enabled: false - discovery: - client: - simple: - instances: - books-service[0]: - uri: http://localhost:80 - books-service[1]: - uri: http://localhost:81 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml index 231d45004f..6bd5b8efc7 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/src/test/resources/application-test.yml @@ -14,6 +14,6 @@ spring: simple: instances: books-service[0]: - uri: http://localhost:80 + uri: http://localhost:1030 books-service[1]: - uri: http://localhost:81 + uri: http://localhost:1031 From 946f84976785a7942782d14fed6121ba48ec86ed Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:34:00 +0200 Subject: [PATCH 419/831] Update StreamToMapAndMultiMapUnitTest.java (#15146) --- .../StreamToMapAndMultiMapUnitTest.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java index 4d957fd704..f5da353551 100644 --- a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java @@ -1,6 +1,7 @@ package com.baeldung.streamtomapandmultimap; -import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; import org.junit.Test; import java.util.*; @@ -32,16 +33,16 @@ public class StreamToMapAndMultiMapUnitTest { public void givenStringStream_whenConvertingToMultimap_thenExpectedMultimapIsGenerated() { Stream stringStream = Stream.of("one", "two", "three", "two"); - LinkedHashMultimap multimap = LinkedHashMultimap.create(); + ListMultimap multimap = stringStream.collect( + ArrayListMultimap::create, + (map, element) -> map.put(element, element), + ArrayListMultimap::putAll + ); - stringStream.collect(Collectors.groupingBy( - s -> s, - Collectors.mapping(s -> s, Collectors.toList()) - )).forEach((key, value) -> multimap.putAll(key, value)); - - LinkedHashMultimap expectedMultimap = LinkedHashMultimap.create(); + ListMultimap expectedMultimap = ArrayListMultimap.create(); expectedMultimap.put("one", "one"); expectedMultimap.put("two", "two"); + expectedMultimap.put("two", "two"); expectedMultimap.put("three", "three"); assertEquals(expectedMultimap, multimap); @@ -97,4 +98,4 @@ public class StreamToMapAndMultiMapUnitTest { assertEquals(expectedMap, resultMap); } -} \ No newline at end of file +} From 4d7e5eb5c9a143afbe37833cb7a6296fd16b41b6 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:40:42 +0200 Subject: [PATCH 420/831] This commit is related to the article BAEL-6988 (#15149) This commit aims to add a test class "HexToIntConversionUnitTest.java" that provides several ways to convert Hex string into int. --- .../hextoint/HexToIntConversionUnitTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-hex/test/java/com/baeldung/hextoint/HexToIntConversionUnitTest.java diff --git a/core-java-modules/core-java-hex/test/java/com/baeldung/hextoint/HexToIntConversionUnitTest.java b/core-java-modules/core-java-hex/test/java/com/baeldung/hextoint/HexToIntConversionUnitTest.java new file mode 100644 index 0000000000..c236f0a818 --- /dev/null +++ b/core-java-modules/core-java-hex/test/java/com/baeldung/hextoint/HexToIntConversionUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.hextoint; + +import org.junit.Test; + +import java.math.BigInteger; + +import static org.junit.Assert.assertEquals; + +public class HexToIntConversionUnitTest { + + @Test + public void givenValidHexString_whenUsingParseInt_thenExpectCorrectDecimalValue() { + String hexString = "0x00FF00"; + int expectedDecimalValue = 65280; + + int decimalValue = Integer.parseInt(hexString.substring(2), 16); + + assertEquals(expectedDecimalValue, decimalValue); + } + + @Test + public void givenValidHexString_whenUsingIntegerDecode_thenExpectCorrectDecimalValue() { + String hexString = "0x00FF00"; + int expectedDecimalValue = 65280; + + int decimalValue = Integer.decode(hexString); + + assertEquals(expectedDecimalValue, decimalValue); + } + + @Test + public void givenValidHexString_whenUsingBigInteger_thenExpectCorrectDecimalValue() { + String hexString = "0x00FF00"; + int expectedDecimalValue = 65280; + + BigInteger bigIntegerValue = new BigInteger(hexString.substring(2), 16); + int decimalValue = bigIntegerValue.intValue(); + assertEquals(expectedDecimalValue, decimalValue); + } + + +} From 03c615201fdad5e3bd54f7c701972bb248f7d2a7 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 6 Nov 2023 16:26:35 -0300 Subject: [PATCH 421/831] Update InterruptThread.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on a comment: Section 6 should be headlined with “Using System.exit()” since that’s what stops code execution, not the boolean variable (this is just a means to decide that execution should be stopped, like the negative array element in section 4. Also it’s unclear why we’d need the “if (isInterrupted())” statement in the while loop of the 8th section: how should isInterrupted() be true one line after we’ve checked in the while loop header that it’s false? Admittedly there’s a little chance that the interrupt status changed between these 2 lines, but this if statement would make much more sense somewhere in the business logic code where more time has passed since the evaluation of “while (!isInterrupted())”… and if that business code doesn’t have that complexity/length, one should omit this if statement altogether, since it creates more confusion than it helps for timely reaction on an interruption. --- .../main/java/com/baeldung/stopexecution/InterruptThread.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/stopexecution/InterruptThread.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/stopexecution/InterruptThread.java index 7964ad9f52..7fcb6185cc 100644 --- a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/stopexecution/InterruptThread.java +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/stopexecution/InterruptThread.java @@ -4,9 +4,7 @@ public class InterruptThread extends Thread { @Override public void run() { while (!isInterrupted()) { - if (isInterrupted()) { - break; - } + break; // business logic } } From e0c7ddb52e1dece9cab52b901b5e66aa86395f7a Mon Sep 17 00:00:00 2001 From: mcasari Date: Mon, 6 Nov 2023 20:38:18 +0100 Subject: [PATCH 422/831] BAEL-6600 - limit max size by LinkedHashMap and custom HashMap --- .../baeldung/map/HashMapWithMaxSizeLimit.java | 25 +++++++++++ ...MaxSizeHashMapByCustomHashMapUnitTest.java | 43 +++++++++++++++++++ ...MaxSizeHashMapByLinkedHashMapUnitTest.java | 35 +++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java new file mode 100644 index 0000000000..4d2d6e8d53 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -0,0 +1,25 @@ +package com.baeldung.map; + +import java.util.HashMap; + +public class HashMapWithMaxSizeLimit extends HashMap { + + private static final long serialVersionUID = 1L; + + private int maxSize = -1; + + + public HashMapWithMaxSizeLimit(int maxSize) { + super(); + this.maxSize = maxSize; + } + + + public V putWithLimit(K key, V value) throws Exception { + if (this.maxSize != - 1 && this.size() >= this.maxSize && !this.containsKey(key)) { + throw new Exception("Max size exceeded!"); + } + return this.put(key, value); + } + +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java new file mode 100644 index 0000000000..5be9c61245 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.map; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LimitMaxSizeHashMapByCustomHashMapUnitTest { + + private final int MAX_SIZE = 4; + private LinkedHashMap linkedHashMap; + + @BeforeEach + void setUp() { + linkedHashMap = new LinkedHashMap() { + private static final long serialVersionUID = 1L; + + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_SIZE; + } + }; + linkedHashMap.put(1, "One"); + linkedHashMap.put(2, "Two"); + linkedHashMap.put(3, "Three"); + linkedHashMap.put(4, "Four"); + } + + @Test + void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { + linkedHashMap.put(5, "Five"); + String[] expectedArrayAfterFive = { "Two", "Three", "Four", "Five" }; + assertArrayEquals(expectedArrayAfterFive, linkedHashMap.values() + .toArray()); + linkedHashMap.put(6, "Six"); + String[] expectedArrayAfterSix = { "Three", "Four", "Five", "Six" }; + assertArrayEquals(expectedArrayAfterSix, linkedHashMap.values() + .toArray()); + } + +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java new file mode 100644 index 0000000000..20fcd94011 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.map; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LimitMaxSizeHashMapByLinkedHashMapUnitTest { + + private final int MAX_SIZE = 4; + private HashMapWithMaxSizeLimit hashMapWithMaxSizeLimit; + + @BeforeEach + void setUp() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + } + + @Test + void givenCustomHashMapObject_whenAddingNewEntryAndLimitExceeded_thenThrowsException() { + Exception exception = assertThrows(Exception.class, () -> { + hashMapWithMaxSizeLimit.putWithLimit(1, "One"); + hashMapWithMaxSizeLimit.putWithLimit(2, "Two"); + hashMapWithMaxSizeLimit.putWithLimit(3, "Three"); + hashMapWithMaxSizeLimit.putWithLimit(4, "Four"); + hashMapWithMaxSizeLimit.putWithLimit(5, "Five"); + }); + + String messageThrownWhenSizeExceedsLimit = "Max size exceeded!"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.equals(messageThrownWhenSizeExceedsLimit)); + } + +} From 4ef6b9039f4e77075b6b199a5df9106da22f20ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan=20Cardo=C5=9F?= <106325528+sodrac@users.noreply.github.com> Date: Mon, 6 Nov 2023 22:47:45 +0200 Subject: [PATCH 423/831] BAEL-6874 update test code for article (#15155) * BAEL-6819 convert from int to Long in Java * BAEL-6819 update package name * BAEL-6874 test code for article * BAEL-6874 rename test class * BAEL-6874 update test code for article --- .../GenericNumbersComparatorUnitTest.java | 40 ++----------------- 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java index 37b971b5c5..0fcc0f3453 100644 --- a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java @@ -1,13 +1,12 @@ package com.baeldung.genericnumberscomparator; +import static org.assertj.core.api.Assertions.entry; import static org.junit.jupiter.api.Assertions.assertEquals; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Comparator; -import java.util.HashMap; import java.util.Map; -import java.util.Optional; import java.util.function.BiFunction; import java.util.function.BiPredicate; import java.util.function.Function; @@ -25,6 +24,7 @@ class GenericNumbersComparatorUnitTest { assertEquals(0, compareDouble(5, 5.0)); } + // we create a method that compares Integer, but this could also be done for other types e.g. Double, BigInteger public int compareTo(Integer int1, Integer int2) { return int1.compareTo(int2); } @@ -34,11 +34,10 @@ class GenericNumbersComparatorUnitTest { assertEquals(-1, compareTo(5, 7)); } - Map, BiFunction> comparisonMap = new HashMap<>(); + // for this example, we create a function that compares Integer, but this could also be done for other types e.g. Double, BigInteger + Map, BiFunction> comparisonMap = Map.ofEntries(entry(Integer.class, (num1, num2) -> ((Integer) num1).compareTo((Integer) num2))); public int compareUsingMap(Number num1, Number num2) { - comparisonMap.put(Integer.class, (a, b) -> ((Integer) num1).compareTo((Integer) num2)); - return comparisonMap.get(num1.getClass()) .apply(num1, num2); } @@ -70,24 +69,6 @@ class GenericNumbersComparatorUnitTest { assertEquals(-1, compareUsingReflection(5, 7)); } - interface NumberComparatorFactory { - Comparator getComparator(); - } - - class IntegerComparatorFactory implements NumberComparatorFactory { - @Override - public Comparator getComparator() { - return (num1, num2) -> ((Integer) num1).compareTo((Integer) num2); - } - } - - @Test - void givenNumbers_whenUseComparatorFactory_thenWillExecuteComparison() { - NumberComparatorFactory factory = new IntegerComparatorFactory(); - Comparator comparator = factory.getComparator(); - assertEquals(-1, comparator.compare(5, 7)); - } - Function toDouble = Number::doubleValue; BiPredicate isEqual = (num1, num2) -> toDouble.apply(num1) .equals(toDouble.apply(num2)); @@ -97,19 +78,6 @@ class GenericNumbersComparatorUnitTest { assertEquals(true, isEqual.test(5, 5.0)); } - private Number someNumber = 5; - private Number anotherNumber = 5.0; - - Optional optNum1 = Optional.ofNullable(someNumber); - Optional optNum2 = Optional.ofNullable(anotherNumber); - int comparisonResult = optNum1.flatMap(n1 -> optNum2.map(n2 -> Double.compare(n1.doubleValue(), n2.doubleValue()))) - .orElse(0); - - @Test - void givenNumbers_whenUseComparisonResult_thenWillExecuteComparison() { - assertEquals(0, comparisonResult); - } - private boolean someCondition = true; Function dynamicFunction = someCondition ? Number::doubleValue : Number::intValue; Comparator dynamicComparator = (num1, num2) -> ((Comparable) dynamicFunction.apply(num1)).compareTo(dynamicFunction.apply(num2)); From 392928ccfaac9eb3f0521b2c914b9b2f1905e053 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Mon, 6 Nov 2023 20:59:54 +0000 Subject: [PATCH 424/831] Remove unnecessary spy annotation and make unit tests package private --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 2 +- .../ReturnFirstNonNullLazyEvaluateUnitTest.java | 12 +++++------- .../ReturnFirstNonNullUnitTest.java | 12 ++++++------ 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java index c432af6591..4686692215 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -19,7 +19,7 @@ public class ReturnFirstNonEmptyOptionalUnitTest { } @Test - public void givenListOfOptionals_thenReturnFirstNonEmpty() { + void givenListOfOptionals_thenReturnFirstNonEmpty() { Optional object = optionals.stream() .filter(Optional::isPresent) .map(Optional::get) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java index f6bf6adbdc..649e5f4299 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -13,15 +13,13 @@ import java.util.stream.Stream; import org.apache.commons.lang3.ObjectUtils; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.mockito.Spy; public class ReturnFirstNonNullLazyEvaluateUnitTest { - @Spy private final LazyEvaluate spy = Mockito.spy(new LazyEvaluate()); @Test - public void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { + void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { String object = spy.methodA(); if (object == null) { object = spy.methodB(); @@ -38,7 +36,7 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { } @Test - public void givenChainOfMethods_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + void givenChainOfMethods_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { String object = ObjectUtils.getFirstNonNull(spy::methodA, spy::methodB, spy::methodC); assertEquals("first non null", object); @@ -48,7 +46,7 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { } @Test - public void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { + void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { Optional object = Stream.> of(spy::methodA, spy::methodB, spy::methodC) .map(Supplier::get) .filter(Objects::nonNull) @@ -61,7 +59,7 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { } @Test - public void givenNonNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + void givenNonNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { String nonNullObject = spy.methodB(); String object = ObjectUtils.getIfNull(nonNullObject, spy::methodC); @@ -70,7 +68,7 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { } @Test - public void givenNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + void givenNullObjectAndFallbackMethod_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { String nullObject = null; String object = ObjectUtils.getIfNull(nullObject, spy::methodB); diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java index f99a8cb419..aae775997d 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -26,7 +26,7 @@ public class ReturnFirstNonNullUnitTest { } @Test - public void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { + void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { Optional object = objects.stream() .filter(o -> o != null) .findFirst(); @@ -35,7 +35,7 @@ public class ReturnFirstNonNullUnitTest { } @Test - public void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { + void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { Optional object = objects.stream() .filter(Objects::nonNull) .findFirst(); @@ -44,7 +44,7 @@ public class ReturnFirstNonNullUnitTest { } @Test - public void givenListOfObjects_whenIteratingWithForLoop_thenReturnFirstNonNull() { + void givenListOfObjects_whenIteratingWithForLoop_thenReturnFirstNonNull() { String object = null; for (int i = 0; i < objects.size(); i++) { if (objects.get(i) != null) { @@ -57,21 +57,21 @@ public class ReturnFirstNonNullUnitTest { } @Test - public void givenListOfObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { + void givenListOfObjects_whenUsingApacheCommonsLang3_thenReturnFirstNonNull() { String object = ObjectUtils.firstNonNull(objects.toArray(new String[0])); assertEquals("first non null", object); } @Test - public void givenListOfObjects_whenUsingGoogleGuavaIterables_thenReturnFirstNonNull() { + void givenListOfObjects_whenUsingGoogleGuavaIterables_thenReturnFirstNonNull() { String object = Iterables.find(objects, Predicates.notNull()); assertEquals("first non null", object); } @Test - public void givenTwoObjects_whenUsingGoogleGuavaMoreObjects_thenReturnFirstNonNull() { + void givenTwoObjects_whenUsingGoogleGuavaMoreObjects_thenReturnFirstNonNull() { String nullObject = null; String nonNullObject = "first non null"; String object = MoreObjects.firstNonNull(nullObject, nonNullObject); From 9e995c1e417a8fc2a9d3339bc64adf7568746353 Mon Sep 17 00:00:00 2001 From: Mateusz Szablak Date: Mon, 6 Nov 2023 22:38:36 +0100 Subject: [PATCH 425/831] BAEL-6489 Time Conversions Using TimeUnit (#14390) --- .../TimeUnitConversionsUnitTest.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/timeunitconversions/TimeUnitConversionsUnitTest.java diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/timeunitconversions/TimeUnitConversionsUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/timeunitconversions/TimeUnitConversionsUnitTest.java new file mode 100644 index 0000000000..cbcbcd566b --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/timeunitconversions/TimeUnitConversionsUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung.timeunitconversions; + +import org.junit.jupiter.api.Test; + +import java.util.concurrent.TimeUnit; + +import static org.assertj.core.api.Assertions.assertThat; + +class TimeUnitConversionsUnitTest { + + + @Test + void givenSeconds_whenConvertToMinutes_thenCorrect() { + int input = 60; + + long minutes = TimeUnit.MINUTES.convert(input, TimeUnit.SECONDS); + + assertThat(minutes).isEqualTo(1); + } + + @Test + void givenMinutes_whenConvertToSeconds_thenCorrect() { + int input = 1; + + long seconds = TimeUnit.SECONDS.convert(input, TimeUnit.MINUTES); + + assertThat(seconds).isEqualTo(60); + } + + @Test + void givenSeconds_whenToMinutes_thenCorrect() { + int input = 60; + + long minutes = TimeUnit.SECONDS.toMinutes(input); + + assertThat(minutes).isEqualTo(1); + } + + @Test + void givenMinutes_whenToSeconds_thenCorrect() { + int input = 1; + + long seconds = TimeUnit.MINUTES.toSeconds(input); + + assertThat(seconds).isEqualTo(60); + } + + @Test + void givenNegativeInput_whenToMinutes_thenCorrect() { + int input = -60; + + long minutes = TimeUnit.SECONDS.toMinutes(input); + assertThat(minutes).isEqualTo(-1); + } + + @Test + void givenNonTotalInput_whenToMinutes_thenCorrectTotalResultWithDecimalTruncate() { + long positiveUnder = TimeUnit.SECONDS.toMinutes(59); + long positiveAbove = TimeUnit.SECONDS.toMinutes(61); + + assertThat(positiveUnder).isEqualTo(0); + assertThat(positiveAbove).isEqualTo(1); + } + + @Test + void givenNonTotalNegativeInput_whenToMinutes_thenCorrectTotalResultWithDecimalTruncate() { + long negativeUnder = TimeUnit.SECONDS.toMinutes(-59); + long negativeAbove = TimeUnit.SECONDS.toMinutes(-61); + + assertThat(negativeUnder).isEqualTo(0); + assertThat(negativeAbove).isEqualTo(-1); + } + + @Test + void givenOverflowInput_whenToMillis_thenTruncatedToLimit() { + long maxMillis = TimeUnit.DAYS.toMillis(Long.MAX_VALUE); + long minMillis = TimeUnit.DAYS.toMillis(Long.MIN_VALUE); + + assertThat(maxMillis).isEqualTo(Long.MAX_VALUE); + assertThat(minMillis).isEqualTo(Long.MIN_VALUE); + } + + @Test + void givenInput_whenExtractFineTimeUnits_thenCorrect() { + long inputSeconds = 3672; + + long hours = TimeUnit.SECONDS.toHours(inputSeconds); + + long secondsRemainingAfterHours = inputSeconds - TimeUnit.HOURS.toSeconds(hours); + long minutes = TimeUnit.SECONDS.toMinutes(secondsRemainingAfterHours); + + long seconds = secondsRemainingAfterHours - TimeUnit.MINUTES.toSeconds(minutes); + + + assertThat(hours).isEqualTo(1); + assertThat(minutes).isEqualTo(1); + assertThat(seconds).isEqualTo(12); + + assertThat(inputSeconds).isEqualTo( + (hours * 60 * 60) + + (minutes * 60) + + (seconds) + ); + } +} From 14070ec048db08590402f87ebc4bd9b2065d23ec Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Tue, 7 Nov 2023 04:50:48 +0100 Subject: [PATCH 426/831] BAEL-6139: Added ThreadMonitorInfo (#15094) * BAEL-6139: Added ThreadMonitorInfo * BAEL-6139: Move ThreadMonitorInfo * BAEL-6139: Unsafe using park() and unpark(Thread) --- .../com/baeldung/park/ThreadMonitorInfo.java | 26 +++++++++ .../PreemptivePermitsBehaviorUnitTest.java | 27 +++++++++ ...atedPreemptivePermitsBehaviorUnitTest.java | 43 ++++++++++++++ .../ThreadInterruptedBehaviorUnitTest.java | 56 +++++++++++++++++++ .../park/TreadMonitorsBehaviorUnitTest.java | 51 +++++++++++++++++ 5 files changed, 203 insertions(+) create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/park/ThreadMonitorInfo.java create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/park/PreemptivePermitsBehaviorUnitTest.java create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/park/RepeatedPreemptivePermitsBehaviorUnitTest.java create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/park/ThreadInterruptedBehaviorUnitTest.java create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/park/TreadMonitorsBehaviorUnitTest.java diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/park/ThreadMonitorInfo.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/park/ThreadMonitorInfo.java new file mode 100644 index 0000000000..948fb48fcb --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/park/ThreadMonitorInfo.java @@ -0,0 +1,26 @@ +package com.baeldung.park; + +import java.util.concurrent.locks.LockSupport; + +public class ThreadMonitorInfo { + private static final Object MONITOR = new Object(); + public static void main(String[] args) throws InterruptedException { + final Thread waitingThread = new Thread(() -> { + try { + synchronized (MONITOR) { + MONITOR.wait(); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }, "Waiting Thread"); + + final Thread parkedThread = new Thread(LockSupport::park, "Parked Thread"); + + waitingThread.start(); + parkedThread.start(); + + waitingThread.join(); + parkedThread.join(); + } +} diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/PreemptivePermitsBehaviorUnitTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/PreemptivePermitsBehaviorUnitTest.java new file mode 100644 index 0000000000..05bfa4ba0b --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/PreemptivePermitsBehaviorUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.park; + +import static org.junit.jupiter.api.Assertions.*; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.locks.LockSupport; +import org.junit.jupiter.api.Test; + +class PreemptivePermitsBehaviorUnitTest { + + private final Thread parkedThread = new Thread() { + @Override + public void run() { + LockSupport.unpark(this); + LockSupport.park(); + } + }; + + @Test + void givenThreadWhenPreemptivePermitShouldNotPark() { + assertTimeoutPreemptively(Duration.of(1, ChronoUnit.SECONDS), () -> { + parkedThread.start(); + parkedThread.join(); + }); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/RepeatedPreemptivePermitsBehaviorUnitTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/RepeatedPreemptivePermitsBehaviorUnitTest.java new file mode 100644 index 0000000000..98be58e9d3 --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/RepeatedPreemptivePermitsBehaviorUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.park; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.locks.LockSupport; +import org.junit.jupiter.api.Test; + +class RepeatedPreemptivePermitsBehaviorUnitTest { + + private final Thread parkedThread = new Thread() { + @Override + public void run() { + LockSupport.unpark(this); + LockSupport.unpark(this); + LockSupport.park(); + LockSupport.park(); + } + }; + + @Test + void givenThreadWhenRepeatedPreemptivePermitShouldPark() { + Callable callable = () -> { + parkedThread.start(); + parkedThread.join(); + return true; + }; + + boolean result = false; + final Future future = Executors.newSingleThreadExecutor().submit(callable); + try { + result = future.get(1, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + // Expected the thread to be parked + } + assertFalse(result, "The thread should be parked"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/ThreadInterruptedBehaviorUnitTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/ThreadInterruptedBehaviorUnitTest.java new file mode 100644 index 0000000000..da7b6ffbc9 --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/ThreadInterruptedBehaviorUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.park; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.LockSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + +class ThreadInterruptedBehaviorUnitTest { + + @Test + @Timeout(3) + void givenParkedThreadWhenInterruptedShouldNotResetInterruptedFlag() throws InterruptedException { + final Thread thread = new Thread(LockSupport::park); + thread.start(); + thread.interrupt(); + assertTrue(thread.isInterrupted(), "The thread should have the interrupted flag"); + thread.join(); + } + + @Test + @Timeout(3) + void givenParkedThreadWhenNotInterruptedShouldNotHaveInterruptedFlag() throws InterruptedException { + final Thread thread = new Thread(LockSupport::park); + thread.start(); + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + LockSupport.unpark(thread); + assertFalse(thread.isInterrupted(), "The thread shouldn't have the interrupted flag"); + thread.join(); + } + + @Test + @Timeout(3) + void givenWaitingThreadWhenNotInterruptedShouldNotHaveInterruptedFlag() throws InterruptedException { + + final Thread thread = new Thread() { + @Override + public void run() { + synchronized (this) { + try { + this.wait(); + } catch (InterruptedException e) { + // The thread was interrupted + } + } + } + }; + + thread.start(); + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + thread.interrupt(); + thread.join(); + assertFalse(thread.isInterrupted(), "The thread shouldn't have the interrupted flag"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/TreadMonitorsBehaviorUnitTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/TreadMonitorsBehaviorUnitTest.java new file mode 100644 index 0000000000..b14b674a19 --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/park/TreadMonitorsBehaviorUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.park; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.LockSupport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + + +class TreadMonitorsBehaviorUnitTest { + + @Test + @Timeout(3) + void giveThreadWhenNotifyWithoutAcquiringMonitorThrowsException() { + final Thread thread = new Thread() { + @Override + public void run() { + synchronized (this) { + try { + this.wait(); + } catch (InterruptedException e) { + // The thread was interrupted + } + } + } + }; + + assertThrows(IllegalMonitorStateException.class, () -> { + thread.start(); + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); + thread.notify(); + thread.join(); + }); + } + + @Test + @Timeout(3) + void giveThreadWhenUnparkWithoutAcquiringMonitor() { + final Thread thread = new Thread(LockSupport::park); + assertTimeoutPreemptively(Duration.of(2, ChronoUnit.SECONDS), () -> { + thread.start(); + LockSupport.unpark(thread); + }); + } +} From a7f39e4155917e732664262beaa686259add6321 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Tue, 7 Nov 2023 13:42:25 +0530 Subject: [PATCH 427/831] Spell mistake fix --- .../java/com/baledung/billpugh/BillPughSingletonUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java index b42d36229f..dcf2098b4b 100644 --- a/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java +++ b/patterns-modules/design-patterns-singleton/src/test/java/com/baledung/billpugh/BillPughSingletonUnitTest.java @@ -15,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class BillPughSingletonUnitTest { Logger logger = LoggerFactory.getLogger(BillPughSingletonUnitTest.class); @Test - void giveSynchronizedLazyLoadedImpl_whenCallgetInstance_thenReturnSingleton() { + void givenSynchronizedLazyLoadedImpl_whenCallgetInstance_thenReturnSingleton() { Set setHoldingSingletonObj = new HashSet<>(); List> futures = new ArrayList<>(); From f1424a62ef6f8bab13fee10463435d895de9da33 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 7 Nov 2023 15:52:43 +0530 Subject: [PATCH 428/831] JAVA-26556: Changes made for Adding missed modules (#15105) /core-java-modules/core-java-numbers-conversions /core-java-modules/core-java-datetime-conversion /di-modules/avaje/persistence-modules/spring-boot-persistence-4 /spring-boot-modules/spring-boot-security-2 /spring-boot-modules/spring-boot-ssl-bundles /spring-boot-modules/spring-boot-telegram --- ...nversionsTest.java => FloatDoubleConversionsUnitTest.java} | 2 +- core-java-modules/pom.xml | 4 +++- di-modules/pom.xml | 1 + persistence-modules/pom.xml | 1 + spring-boot-modules/pom.xml | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) rename core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/{FloatDoubleConversionsTest.java => FloatDoubleConversionsUnitTest.java} (95%) diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsUnitTest.java similarity index 95% rename from core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java rename to core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsUnitTest.java index 9da50276a9..2bddb6d8cd 100644 --- a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsTest.java +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/floatdoubleconversions/FloatDoubleConversionsUnitTest.java @@ -3,7 +3,7 @@ package com.baeldung.floatdoubleconversions; import org.junit.Assert; import org.junit.Test; -public class FloatDoubleConversionsTest { +public class FloatDoubleConversionsUnitTest { @Test public void whenDoubleType_thenFloatTypeSuccess(){ diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 79596d2067..f4bda010e8 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -32,6 +32,7 @@ + core-java-numbers-conversions core-java-9-improvements core-java-9-streams core-java-9 @@ -195,9 +196,10 @@ core-java-records core-java-9-jigsaw + core-java-collections-set core-java-date-operations-1 - + core-java-datetime-conversion core-java-httpclient java-native diff --git a/di-modules/pom.xml b/di-modules/pom.xml index e6c86d48e6..984180cb28 100644 --- a/di-modules/pom.xml +++ b/di-modules/pom.xml @@ -18,6 +18,7 @@ dagger flyway-cdi-extension guice + avaje \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index eb4b212771..8726b7ad87 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -120,6 +120,7 @@ scylladb spring-data-cassandra-2 spring-data-jpa-repo-3 + spring-boot-persistence-4 diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 259a40dc38..433f23f4ba 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -68,6 +68,9 @@ spring-boot-runtime spring-boot-runtime-2 spring-boot-security + spring-boot-security-2 + spring-boot-ssl-bundles + spring-boot-telegram spring-boot-springdoc spring-boot-swagger spring-boot-swagger-2 From 19e70b20a485c7abf466a7fd29557ed31787d601 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 7 Nov 2023 15:58:16 +0530 Subject: [PATCH 429/831] =?UTF-8?q?JAVA-26498:=20Changes=20made=20for=20ad?= =?UTF-8?q?ding=20missed=20module=20core-java-collectio=E2=80=A6=20(#15071?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /core-java-modules/core-java-collections-conversions-2 /core-java-modules/core-java-collections-conversions-3 /core-java-modules/core-java-concurrency-advanced-5 --- core-java-modules/pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index f4bda010e8..a237fe0ed6 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -21,7 +21,9 @@ - + core-java-collections-conversions-2 + core-java-collections-conversions-3 + core-java-concurrency-advanced-5 From 63758605c922c7daa0a8fa3413091967ff2dae5d Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 7 Nov 2023 16:45:05 +0530 Subject: [PATCH 430/831] JAVA-26557: Changes made for Adding missed modules (#15121) /libraries-ai /spring-pulsar /maven-modules/versions-maven-plugin/original --- maven-modules/versions-maven-plugin/original/pom.xml | 5 ----- maven-modules/versions-maven-plugin/pom.xml | 11 +++++++++++ pom.xml | 3 +++ spring-pulsar/pom.xml | 5 +---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/maven-modules/versions-maven-plugin/original/pom.xml b/maven-modules/versions-maven-plugin/original/pom.xml index 2d81274611..6026dac9fe 100644 --- a/maven-modules/versions-maven-plugin/original/pom.xml +++ b/maven-modules/versions-maven-plugin/original/pom.xml @@ -18,11 +18,6 @@ commons-collections4 ${commons-collections4.version} - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - org.apache.commons commons-compress diff --git a/maven-modules/versions-maven-plugin/pom.xml b/maven-modules/versions-maven-plugin/pom.xml index 9c837cefa0..ec1e0ceaba 100644 --- a/maven-modules/versions-maven-plugin/pom.xml +++ b/maven-modules/versions-maven-plugin/pom.xml @@ -7,6 +7,17 @@ versions-maven-plugin 0.0.1-SNAPSHOT versions-maven-plugin + pom + + + maven-modules + com.baeldung + 0.0.1-SNAPSHOT + + + + original + diff --git a/pom.xml b/pom.xml index 12a8f3dc1d..a16fabebc5 100644 --- a/pom.xml +++ b/pom.xml @@ -860,6 +860,7 @@ libraries-http libraries-http-2 libraries-io + libraries-ai libraries-primitive libraries-rpc libraries-server @@ -930,6 +931,7 @@ spring-kafka-2 libraries-llms + spring-pulsar @@ -1212,6 +1214,7 @@ spring-kafka-2 libraries-llms + spring-pulsar diff --git a/spring-pulsar/pom.xml b/spring-pulsar/pom.xml index 05debcab1c..a1c834f830 100644 --- a/spring-pulsar/pom.xml +++ b/spring-pulsar/pom.xml @@ -15,10 +15,6 @@ ../parent-boot-3 - - 17 - 0.2.0 - org.springframework.boot @@ -47,6 +43,7 @@ + 17 0.2.0 From 270acf62e46bc420a0517d756fa63b1742b904b2 Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Tue, 7 Nov 2023 21:49:49 +0530 Subject: [PATCH 431/831] Formatter Changes --- .../ResultSetToMapUnitTest.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java index c8a6351804..e449beb83a 100644 --- a/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java +++ b/persistence-modules/core-java-persistence-3/src/test/java/com/baeldung/resultsettomap/ResultSetToMapUnitTest.java @@ -45,7 +45,8 @@ public class ResultSetToMapUnitTest { @Test public void whenUsingContainsKey_thenConvertResultSetToMap() throws SQLException { - ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee").executeQuery(); + ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee") + .executeQuery(); Map> valueMap = new HashMap<>(); while (resultSet.next()) { @@ -54,22 +55,27 @@ public class ResultSetToMapUnitTest { if (!valueMap.containsKey(empCity)) { valueMap.put(empCity, new ArrayList<>()); } - valueMap.get(empCity).add(empName); + valueMap.get(empCity) + .add(empName); } - assertEquals(3, valueMap.get("London").size()); + assertEquals(3, valueMap.get("London") + .size()); } @Test public void whenUsingComputeIfAbsent_thenConvertResultSetToMap() throws SQLException { - ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee").executeQuery(); + ResultSet resultSet = connection.prepareStatement("SELECT * FROM employee") + .executeQuery(); Map> valueMap = new HashMap<>(); while (resultSet.next()) { String empCity = resultSet.getString("empCity"); String empName = resultSet.getString("empName"); - valueMap.computeIfAbsent(empCity, data -> new ArrayList<>()).add(empName); + valueMap.computeIfAbsent(empCity, data -> new ArrayList<>()) + .add(empName); } - assertEquals(3, valueMap.get("London").size()); + assertEquals(3, valueMap.get("London") + .size()); } @Test @@ -81,15 +87,17 @@ public class ResultSetToMapUnitTest { while (resultSet.next()) { String empCity = resultSet.getString("empCity"); String empName = resultSet.getString("empName"); - result.computeIfAbsent(empCity, data -> new ArrayList<>()).add(empName); + result.computeIfAbsent(empCity, data -> new ArrayList<>()) + .add(empName); } return result; } }; - + QueryRunner run = new QueryRunner(); Map> valueMap = run.query(connection, "SELECT * FROM employee", handler); - assertEquals(3, valueMap.get("London").size()); + assertEquals(3, valueMap.get("London") + .size()); } @After From 362610ca587c741843e616d387f613acad3c1340 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Tue, 7 Nov 2023 19:21:46 +0100 Subject: [PATCH 432/831] BAEL-6776: Convert File to Byte Array in Java (#15123) --- .../FileToByteArrayUnitTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/filetofrombytearray/FileToByteArrayUnitTest.java diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/filetofrombytearray/FileToByteArrayUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/filetofrombytearray/FileToByteArrayUnitTest.java new file mode 100644 index 0000000000..1bbd958583 --- /dev/null +++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/filetofrombytearray/FileToByteArrayUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.filetofrombytearray; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +class FileToByteArrayUnitTest { + + private static final String FILE_NAME = "src" + File.separator + "test" + File.separator + "resources" + File.separator + "sample.txt"; + private final byte[] expectedByteArray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100 }; + + @Test + void givenFile_whenUsingFileInputStreamClass_thenConvert() throws IOException { + File myFile = new File(FILE_NAME); + byte[] byteArray = new byte[(int) myFile.length()]; + try (FileInputStream inputStream = new FileInputStream(myFile)) { + inputStream.read(byteArray); + } + + assertArrayEquals(expectedByteArray, byteArray); + } + + @Test + void givenFile_whenUsingNioApiFilesClass_thenConvert() throws IOException { + byte[] byteArray = Files.readAllBytes(Paths.get(FILE_NAME)); + + assertArrayEquals(expectedByteArray, byteArray); + } + + @Test + void givenFile_whenUsingApacheCommonsIOUtilsClass_thenConvert() throws IOException { + File myFile = new File(FILE_NAME); + byte[] byteArray = new byte[(int) myFile.length()]; + try (FileInputStream inputStream = new FileInputStream(myFile)) { + byteArray = IOUtils.toByteArray(inputStream); + } + + assertArrayEquals(expectedByteArray, byteArray); + } + + @Test + void givenFile_whenUsingApacheCommonsFileUtilsClass_thenConvert() throws IOException { + byte[] byteArray = FileUtils.readFileToByteArray(new File(FILE_NAME)); + + assertArrayEquals(expectedByteArray, byteArray); + } + + @Test + void givenFile_whenUsingGuavaFilesClass_thenConvert() throws IOException { + byte[] byteArray = com.google.common.io.Files.toByteArray(new File(FILE_NAME)); + + assertArrayEquals(expectedByteArray, byteArray); + } + +} From 9b28d7739aade6a5baad097206b655d4aa824025 Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Wed, 8 Nov 2023 10:26:53 +0100 Subject: [PATCH 433/831] java-26718: upgrade caffeine version to 3.x (#15138) --- libraries-5/pom.xml | 2 +- spring-5-webflux-2/pom.xml | 2 +- spring-boot-modules/spring-boot-libraries/pom.xml | 2 +- spring-boot-modules/spring-caching-2/pom.xml | 2 ++ spring-boot-modules/spring-caching/pom.xml | 2 ++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml index c98a66c094..a043b4bfa8 100644 --- a/libraries-5/pom.xml +++ b/libraries-5/pom.xml @@ -141,7 +141,7 @@ 2.5.11 0.8.1 3.0.14 - 2.5.5 + 3.1.8 3.0.2 4.5.1 1.0 diff --git a/spring-5-webflux-2/pom.xml b/spring-5-webflux-2/pom.xml index 68945138d4..34cbda6c18 100644 --- a/spring-5-webflux-2/pom.xml +++ b/spring-5-webflux-2/pom.xml @@ -100,7 +100,7 @@ 3.4.5 - 2.9.2 + 3.1.8 1.16.2 diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index d8ca53f013..b7b8ad17ad 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -228,7 +228,7 @@ 3.3.0 7.6.0 0.7.0 - 2.8.2 + 3.1.8 \ No newline at end of file diff --git a/spring-boot-modules/spring-caching-2/pom.xml b/spring-boot-modules/spring-caching-2/pom.xml index 2239256630..ee28ac5ed5 100644 --- a/spring-boot-modules/spring-caching-2/pom.xml +++ b/spring-boot-modules/spring-caching-2/pom.xml @@ -47,6 +47,7 @@ com.github.ben-manes.caffeine caffeine + ${caffeine.version} it.ozimov @@ -64,6 +65,7 @@ 0.7.3 + 3.1.8 \ No newline at end of file diff --git a/spring-boot-modules/spring-caching/pom.xml b/spring-boot-modules/spring-caching/pom.xml index c27ccf3348..f3d9488b89 100644 --- a/spring-boot-modules/spring-caching/pom.xml +++ b/spring-boot-modules/spring-caching/pom.xml @@ -51,6 +51,7 @@ com.github.ben-manes.caffeine caffeine + ${caffeine.version} com.h2database @@ -78,6 +79,7 @@ 3.5.2 + 3.1.8 \ No newline at end of file From c7e2dc2a6ec7a54633ec4f4c988a7d970e656e56 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:06:28 +0200 Subject: [PATCH 434/831] JAVA-27248 Align module names, folder names and artifact id - Week 44 - 2023 (conti-1) (#15147) Co-authored-by: timis1 --- .../core-java-conditionals/pom.xml | 2 +- core-java-modules/core-java-os-2/pom.xml | 4 ++-- di-modules/avaje/pom.xml | 17 ++++++++++------- spring-6-rsocket/pom.xml | 4 ++-- .../spring-boot-security-2/pom.xml | 2 +- .../spring-boot-ssl-bundles/pom.xml | 10 ++++++---- .../spring-reactive-2/pom.xml | 4 ++-- .../spring-reactive-3/pom.xml | 4 ++-- .../spring-reactive-data-couchbase/pom.xml | 2 +- .../spring-reactive-data/pom.xml | 2 +- 10 files changed, 28 insertions(+), 23 deletions(-) diff --git a/core-java-modules/core-java-conditionals/pom.xml b/core-java-modules/core-java-conditionals/pom.xml index 811f183e99..f2ad7df749 100644 --- a/core-java-modules/core-java-conditionals/pom.xml +++ b/core-java-modules/core-java-conditionals/pom.xml @@ -5,7 +5,7 @@ 4.0.0 core-java-conditionals 0.1.0-SNAPSHOT - core-java-compiler + core-java-conditionals jar diff --git a/core-java-modules/core-java-os-2/pom.xml b/core-java-modules/core-java-os-2/pom.xml index 53fdafa7d4..11b0585ae7 100644 --- a/core-java-modules/core-java-os-2/pom.xml +++ b/core-java-modules/core-java-os-2/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 - core-java-os - core-java-os + core-java-os-2 + core-java-os-2 jar diff --git a/di-modules/avaje/pom.xml b/di-modules/avaje/pom.xml index 49162c518e..03d3902d5f 100644 --- a/di-modules/avaje/pom.xml +++ b/di-modules/avaje/pom.xml @@ -3,14 +3,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - inject-intro + avaje 0.0.1-SNAPSHOT - avaje-inject-intro - - 11 - 11 - 9.5 - + avaje + Avaje Inject Intro + io.avaje @@ -34,4 +31,10 @@ true + + + 11 + 11 + 9.5 + \ No newline at end of file diff --git a/spring-6-rsocket/pom.xml b/spring-6-rsocket/pom.xml index 5d15a605ae..0f9e63bc7e 100644 --- a/spring-6-rsocket/pom.xml +++ b/spring-6-rsocket/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.bealdung - rsocket + spring-6-rsocket 0.0.1-SNAPSHOT - rsocket + spring-6-rsocket com.baeldung diff --git a/spring-boot-modules/spring-boot-security-2/pom.xml b/spring-boot-modules/spring-boot-security-2/pom.xml index db094f33a6..dd8cab81de 100644 --- a/spring-boot-modules/spring-boot-security-2/pom.xml +++ b/spring-boot-modules/spring-boot-security-2/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-security-2 - spring-boot-security-1 + spring-boot-security-2 jar Spring Boot Security Auto-Configuration diff --git a/spring-boot-modules/spring-boot-ssl-bundles/pom.xml b/spring-boot-modules/spring-boot-ssl-bundles/pom.xml index 4802e9ec58..770d8c2f01 100644 --- a/spring-boot-modules/spring-boot-ssl-bundles/pom.xml +++ b/spring-boot-modules/spring-boot-ssl-bundles/pom.xml @@ -3,16 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + spring-boot-ssl-bundles + spring-boot-ssl-bundles + Module for showing usage of SSL Bundles + jar + com.baeldung parent-boot-3 0.0.1-SNAPSHOT ../../parent-boot-3 - springbootsslbundles - spring-boot-ssl-bundles - jar - Module for showing usage of SSL Bundles + org.springframework.boot diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index 13970851cd..90c5300cc8 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -5,9 +5,9 @@ 4.0.0 spring-reactive-2 0.0.1-SNAPSHOT - spring-5-reactive-2 + spring-reactive-2 jar - spring 5 sample project about new features + spring sample project about new features com.baeldung.spring.reactive diff --git a/spring-reactive-modules/spring-reactive-3/pom.xml b/spring-reactive-modules/spring-reactive-3/pom.xml index 96f23f1339..bf2cdbbf2d 100644 --- a/spring-reactive-modules/spring-reactive-3/pom.xml +++ b/spring-reactive-modules/spring-reactive-3/pom.xml @@ -5,9 +5,9 @@ 4.0.0 spring-reactive-3 0.0.1-SNAPSHOT - spring-5-reactive-3 + spring-reactive-3 jar - spring 5 sample project about new features + spring sample project about new features com.baeldung.spring.reactive diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index 52b10f39d9..a7481d8aca 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-reactive-data-couchbase - spring-data-couchbase + spring-reactive-data-couchbase jar diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index 03ea440b4f..a598315d5d 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-reactive-data - spring-reactive-data-2 + spring-reactive-data jar From 7b6ba0e030db93e6faa5b84fe2fdd02a901a5f80 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 8 Nov 2023 15:54:10 +0530 Subject: [PATCH 435/831] JAVA-26729:Changes made for upgrade commons-validator to latest version (#15159) --- core-java-modules/core-java-datetime-string/pom.xml | 2 +- .../java/com/baeldung/formatinstant/FormatInstantUnitTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-datetime-string/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml index a33114852c..292a38a5af 100644 --- a/core-java-modules/core-java-datetime-string/pom.xml +++ b/core-java-modules/core-java-datetime-string/pom.xml @@ -64,7 +64,7 @@ - 1.6 + 1.7 2.12.5 RELEASE 1.9 diff --git a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/formatinstant/FormatInstantUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/formatinstant/FormatInstantUnitTest.java index ef273e4b81..1466fece46 100644 --- a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/formatinstant/FormatInstantUnitTest.java +++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/formatinstant/FormatInstantUnitTest.java @@ -6,6 +6,7 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.UnsupportedTemporalTypeException; +import java.util.TimeZone; import org.joda.time.format.DateTimeFormat; import org.junit.Test; @@ -17,7 +18,7 @@ public class FormatInstantUnitTest { @Test public void givenInstant_whenUsingDateTimeFormatter_thenFormat() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_FORMAT) - .withZone(ZoneId.systemDefault()); + .withZone(TimeZone.getTimeZone("UTC").toZoneId()); Instant instant = Instant.parse("2022-02-15T18:35:24.00Z"); String formattedInstant = formatter.format(instant); From 33fceb65a61e7f2f94586809d97911bc066031cb Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Wed, 8 Nov 2023 14:16:19 +0100 Subject: [PATCH 436/831] Using CriteriaDefinition Utility in Hibernate (#15128) * Using CriteriaDefinition Utility in Hibernate * Using CriteriaDefinition Utility in Hibernate * Using CriteriaDefinition Utility in Hibernate * Using CriteriaDefinition Utility in Hibernate * Using CriteriaDefinition Utility in Hibernate --- persistence-modules/hibernate-queries/pom.xml | 2 +- .../criteria/util/HibernateUtil.java | 7 + .../CriteriaDefinitionApplicationView.java | 126 ++++++++++++++++++ .../LocalDateStringJavaDescriptor.java | 11 ++ ...nateCriteriaDefinitionIntegrationTest.java | 77 +++++++++++ 5 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/CriteriaDefinitionApplicationView.java create mode 100644 persistence-modules/hibernate-queries/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaDefinitionIntegrationTest.java diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index bb60c7b83a..76f230a72d 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -99,7 +99,7 @@ 8.0.32 2.6.0 2.1.214 - 6.1.7.Final + 6.3.1.Final 1.17.6 diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java index ff9ccb017b..f561a33f08 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/util/HibernateUtil.java @@ -16,4 +16,11 @@ public class HibernateUtil { return session; } + public static SessionFactory getHibernateSessionFactory() { + + final SessionFactory sessionFactory = new Configuration().configure("criteria.cfg.xml").buildSessionFactory(); + + return sessionFactory; + } + } diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/CriteriaDefinitionApplicationView.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/CriteriaDefinitionApplicationView.java new file mode 100644 index 0000000000..9f32aa06e3 --- /dev/null +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/criteria/view/CriteriaDefinitionApplicationView.java @@ -0,0 +1,126 @@ +package com.baeldung.hibernate.criteria.view; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.criteria.CriteriaDefinition; +import org.hibernate.query.criteria.JpaRoot; + +import com.baeldung.hibernate.criteria.model.Item; +import com.baeldung.hibernate.criteria.util.HibernateUtil; + +public class CriteriaDefinitionApplicationView { + + public CriteriaDefinitionApplicationView() { + + } + + public String[] greaterThanCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final SessionFactory sessionFactory = HibernateUtil.getHibernateSessionFactory(); + + CriteriaDefinition query = new CriteriaDefinition<>(sessionFactory, Item.class) { + { + JpaRoot message = from(Item.class); + where(gt(message.get("itemPrice"), 1000)); + } + }; + + List items = session.createSelectionQuery(query).list(); + + final String greaterThanItems[] = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + greaterThanItems[i] = items.get(i).getItemName(); + } + + session.close(); + + return greaterThanItems; + } + + public String[] lessThanCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final SessionFactory sessionFactory = HibernateUtil.getHibernateSessionFactory(); + + CriteriaDefinition query = new CriteriaDefinition<>(sessionFactory, Item.class) { + { + JpaRoot message = from(Item.class); + where(lt(message.get("itemPrice"), 1000)); + } + }; + + List items = session.createSelectionQuery(query).list(); + final String lessThanItems[] = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + lessThanItems[i] = items.get(i).getItemName(); + } + + session.close(); + + return lessThanItems; + } + + public String[] likeCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final SessionFactory sessionFactory = HibernateUtil.getHibernateSessionFactory(); + + CriteriaDefinition query = new CriteriaDefinition<>(sessionFactory, Item.class) { + { + JpaRoot item = from(Item.class); + where(like(item.get("itemName"), "%chair%")); + } + }; + + List items = session.createSelectionQuery(query).list(); + + final String likeItems[] = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + likeItems[i] = items.get(i).getItemName(); + } + session.close(); + return likeItems; + } + + public String[] likeCaseCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final SessionFactory sessionFactory = HibernateUtil.getHibernateSessionFactory(); + + CriteriaDefinition query = new CriteriaDefinition<>(sessionFactory, Item.class) { + { + JpaRoot item = from(Item.class); + where(like(lower(item.get("itemName")), "%chair%")); + } + }; + + List items = session.createSelectionQuery(query).list(); + + final String likeItems[] = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + likeItems[i] = items.get(i).getItemName(); + } + session.close(); + return likeItems; + } + + public String[] betweenCriteria() { + final Session session = HibernateUtil.getHibernateSession(); + final SessionFactory sessionFactory = HibernateUtil.getHibernateSessionFactory(); + + CriteriaDefinition query = new CriteriaDefinition<>(sessionFactory, Item.class) { + { + JpaRoot item = from(Item.class); + where(between(item.get("itemPrice"), 100, 200)); + } + }; + + List items = session.createSelectionQuery(query).list(); + + final String betweenItems[] = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + betweenItems[i] = items.get(i).getItemName(); + } + session.close(); + return betweenItems; + } +} diff --git a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java index 58d8e8628a..e9c7548c7d 100644 --- a/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java +++ b/persistence-modules/hibernate-queries/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java @@ -4,8 +4,13 @@ package com.baeldung.hibernate.customtypes; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import org.hibernate.dialect.Dialect; +import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation; +import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; +import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators; +import org.hibernate.type.spi.TypeConfiguration; import io.hypersistence.utils.hibernate.type.array.internal.AbstractArrayTypeDescriptor; @@ -49,4 +54,10 @@ public class LocalDateStringJavaDescriptor extends AbstractArrayTypeDescriptor expectedLikeList = session.createQuery("From Item where itemName like '%chair%'").list(); + final String expectedLikeItems[] = new String[expectedLikeList.size()]; + for (int i = 0; i < expectedLikeList.size(); i++) { + expectedLikeItems[i] = expectedLikeList.get(i).getItemName(); + } + session.close(); + assertArrayEquals(expectedLikeItems, criteriaDefinition.likeCriteria()); + } + + @Test + public void givenHibernateSession_whenExecutingCaseSensitiveLikeCriteriaQuery_thenExpectMatchingItems() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedChairCaseList = session.createQuery("From Item where itemName like '%Chair%'").list(); + final String expectedChairCaseItems[] = new String[expectedChairCaseList.size()]; + for (int i = 0; i < expectedChairCaseList.size(); i++) { + expectedChairCaseItems[i] = expectedChairCaseList.get(i).getItemName(); + } + session.close(); + assertArrayEquals(expectedChairCaseItems, criteriaDefinition.likeCaseCriteria()); + } + + @Test + public void givenHibernateSession_whenExecutingGreaterThanCriteriaQuery_thenExpectMatchingItems() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedGreaterThanList = session.createQuery("From Item where itemPrice>1000").list(); + final String expectedGreaterThanItems[] = new String[expectedGreaterThanList.size()]; + for (int i = 0; i < expectedGreaterThanList.size(); i++) { + expectedGreaterThanItems[i] = expectedGreaterThanList.get(i).getItemName(); + } + session.close(); + assertArrayEquals(expectedGreaterThanItems, criteriaDefinition.greaterThanCriteria()); + } + + @Test + public void givenHibernateSession_whenExecutingLessThanCriteriaQuery_thenExpectMatchingItems() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedLessList = session.createQuery("From Item where itemPrice<1000").list(); + final String expectedLessThanItems[] = new String[expectedLessList.size()]; + for (int i = 0; i < expectedLessList.size(); i++) { + expectedLessThanItems[i] = expectedLessList.get(i).getItemName(); + } + session.close(); + assertArrayEquals(expectedLessThanItems, criteriaDefinition.lessThanCriteria()); + } + + @Test + public void givenHibernateSession_whenExecutingBetweenCriteriaQuery_thenExpectMatchingItems() { + final Session session = HibernateUtil.getHibernateSession(); + final List expectedBetweenList = session.createQuery("From Item where itemPrice between 100 and 200").list(); + final String expectedPriceBetweenItems[] = new String[expectedBetweenList.size()]; + for (int i = 0; i < expectedBetweenList.size(); i++) { + expectedPriceBetweenItems[i] = expectedBetweenList.get(i).getItemName(); + } + session.close(); + assertArrayEquals(expectedPriceBetweenItems, criteriaDefinition.betweenCriteria()); + } + + +} From 7e81d666c9a10ca2bd3128f73c538f1832b46854 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Thu, 9 Nov 2023 00:08:33 +0200 Subject: [PATCH 437/831] This commit related to BAEL-7103 (#15160) This commit aims to add a test class named "ConvertingHashSetToArrayUnitTest" that provides test methods to convert HashSet to an array. --- .../ConvertingHashSetToArrayUnitTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/toarraymethod/ConvertingHashSetToArrayUnitTest.java diff --git a/core-java-modules/core-java-collections-5/toarraymethod/ConvertingHashSetToArrayUnitTest.java b/core-java-modules/core-java-collections-5/toarraymethod/ConvertingHashSetToArrayUnitTest.java new file mode 100644 index 0000000000..420c1d25e6 --- /dev/null +++ b/core-java-modules/core-java-collections-5/toarraymethod/ConvertingHashSetToArrayUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.toarraymethod; + +import org.junit.Test; + +import java.util.HashSet; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ConvertingHashSetToArrayUnitTest { + + @Test + public void givenStringHashSet_whenConvertedToArray_thenArrayContainsStringElements() { + HashSet stringSet = new HashSet<>(); + stringSet.add("Apple"); + stringSet.add("Banana"); + stringSet.add("Cherry"); + + // Convert the HashSet of Strings to an array of Strings + String[] stringArray = stringSet.toArray(new String[0]); + + // Test that the array is of the correct length + assertEquals(3, stringArray.length); + + for (String str : stringArray) { + assertTrue(stringSet.contains(str)); + } + } + + @Test + public void givenIntegerHashSet_whenConvertedToArray_thenArrayContainsIntegerElements() { + HashSet integerSet = new HashSet<>(); + integerSet.add(5); + integerSet.add(10); + integerSet.add(15); + + // Convert the HashSet of Integers to an array of Integers + Integer[] integerArray = integerSet.toArray(new Integer[0]); + + // Test that the array is of the correct length + assertEquals(3, integerArray.length); + + for (Integer num : integerArray) { + assertTrue(integerSet.contains(num)); + } + + assertTrue(integerSet.contains(5)); + assertTrue(integerSet.contains(10)); + assertTrue(integerSet.contains(15)); + } +} From 5b596e0c49cea6914ba563d15d116303c40670c2 Mon Sep 17 00:00:00 2001 From: Alexander Molochko Date: Wed, 8 Nov 2023 18:05:37 -0700 Subject: [PATCH 438/831] BAEL-7012: Splitting Streams in Kafka (#15029) * BAEL-7012: Splitting Streams in Kafka * Move sources to the spring-kafka module * Move sources to the spring-kafka-2 module --- spring-kafka-2/pom.xml | 2 + .../kafka/kafkasplitting/IotSensorData.java | 31 ++++++++++ .../kafkasplitting/KafkaConsumerConfig.java | 43 +++++++++++++ .../KafkaIotConsumerService.java | 28 +++++++++ .../kafkasplitting/KafkaStreamsConfig.java | 62 +++++++++++++++++++ .../SpringBootKafkaStreamsSplittingApp.java | 12 ++++ .../src/main/resources/application.properties | 4 ++ 7 files changed, 182 insertions(+) create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/IotSensorData.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaConsumerConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaIotConsumerService.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaStreamsConfig.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/SpringBootKafkaStreamsSplittingApp.java diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index 0bca20447d..fdf7da7438 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -65,6 +65,8 @@ 1.16.2 + 3.0.12 + 3.6.0 1.16.2 diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/IotSensorData.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/IotSensorData.java new file mode 100644 index 0000000000..350f6911f3 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/IotSensorData.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.kafka.kafkasplitting; + +public class IotSensorData { + private String sensorType; + private String value; + private String sensorId; + + public String getSensorType() { + return sensorType; + } + + public void setSensorType(String sensorType) { + this.sensorType = sensorType; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getSensorId() { + return sensorId; + } + + public void setSensorId(String sensorId) { + this.sensorId = sensorId; + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaConsumerConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaConsumerConfig.java new file mode 100644 index 0000000000..70640cb582 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaConsumerConfig.java @@ -0,0 +1,43 @@ +package com.baeldung.spring.kafka.kafkasplitting; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.config.KafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; +import org.springframework.kafka.support.serializer.JsonDeserializer; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +class KafkaConsumerConfig { + + @Value("${spring.kafka.consumer.group-id}") + private String groupId; + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Bean + public ConsumerFactory consumerFactory() { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class); + + return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), new JsonDeserializer<>(IotSensorData.class)); + } + + @Bean + KafkaListenerContainerFactory> kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + return factory; + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaIotConsumerService.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaIotConsumerService.java new file mode 100644 index 0000000000..bbd0c549ab --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaIotConsumerService.java @@ -0,0 +1,28 @@ +package com.baeldung.spring.kafka.kafkasplitting; + +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Service; + +@Service +public class KafkaIotConsumerService { + + @KafkaListener(topics = "iot_sensor_data") + public void consumeIotData(IotSensorData item) { + System.out.println("Consumed Message in original \"iot_sensor_data\" topic :" + item.getSensorType()); + } + + @KafkaListener(topics = "iot_sensor_data_temp") + public void consumeIotTemperatureData(IotSensorData item) { + System.out.println("Consumed Temparature data :" + item.getValue()); + } + + @KafkaListener(topics = "iot_sensor_data_hum") + public void consumeIotHumidityData(IotSensorData item) { + System.out.println("Consumed Humidity data :" + item.getValue()); + } + + @KafkaListener(topics = "iot_sensor_data_move") + public void consumeIotMovementData(IotSensorData item) { + System.out.println("Consumed Movement data :" + item.getValue()); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaStreamsConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaStreamsConfig.java new file mode 100644 index 0000000000..c4eb1501fd --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/KafkaStreamsConfig.java @@ -0,0 +1,62 @@ +package com.baeldung.spring.kafka.kafkasplitting; + +import org.apache.kafka.common.serialization.Serde; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.StreamsBuilder; +import org.apache.kafka.streams.kstream.Branched; +import org.apache.kafka.streams.kstream.Consumed; +import org.apache.kafka.streams.kstream.KStream; +import org.apache.kafka.streams.processor.TopicNameExtractor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.annotation.EnableKafkaStreams; +import org.springframework.kafka.support.KafkaStreamBrancher; +import org.springframework.kafka.support.serializer.JsonDeserializer; +import org.springframework.kafka.support.serializer.JsonSerializer; + +@Configuration +@EnableKafka +@EnableKafkaStreams +class KafkaStreamsConfig { + @Value("${kafka.topics.iot}") + private String iotTopicName; + + @Bean + public Serde iotSerde() { + return Serdes.serdeFrom(new JsonSerializer<>(), new JsonDeserializer<>(IotSensorData.class)); + } + + @Bean + public KStream iotStream(StreamsBuilder streamsBuilder) { + KStream stream = streamsBuilder.stream(iotTopicName, Consumed.with(Serdes.String(), iotSerde())); + stream.split() + .branch((key, value) -> value.getSensorType() != null, + Branched.withConsumer(ks -> ks.to((key, value, recordContext) -> String.format("%s_%s", iotTopicName, value.getSensorType())))) + .noDefaultBranch(); + return stream; + } + + @Bean + public KStream iotBrancher(StreamsBuilder streamsBuilder) { + KStream stream = streamsBuilder.stream(iotTopicName, Consumed.with(Serdes.String(), iotSerde())); + + new KafkaStreamBrancher() + .branch((key, value) -> "temp".equals(value.getSensorType()), (ks) -> ks.to(iotTopicName + "_temp")) + .branch((key, value) -> "move".equals(value.getSensorType()), (ks) -> ks.to(iotTopicName + "_move")) + .branch((key, value) -> "hum".equals(value.getSensorType()), (ks) -> ks.to(iotTopicName + "_hum")) + .defaultBranch(ks -> ks.to(String.format("%s_unknown", iotTopicName))) + .onTopOf(stream); + + return stream; + } + + @Bean + public KStream iotTopicExtractor(StreamsBuilder streamsBuilder) { + KStream stream = streamsBuilder.stream(iotTopicName, Consumed.with(Serdes.String(), iotSerde())); + TopicNameExtractor sensorTopicExtractor = (key, value, recordContext) -> String.format("%s_%s", iotTopicName, value.getSensorType()); + stream.to(sensorTopicExtractor); + return stream; + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/SpringBootKafkaStreamsSplittingApp.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/SpringBootKafkaStreamsSplittingApp.java new file mode 100644 index 0000000000..6101eeb13d --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/kafkasplitting/SpringBootKafkaStreamsSplittingApp.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.kafka.kafkasplitting; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootKafkaStreamsSplittingApp { + public static void main(String[] args) { + SpringApplication.run(SpringBootKafkaStreamsSplittingApp.class, args); + } + +} diff --git a/spring-kafka-2/src/main/resources/application.properties b/spring-kafka-2/src/main/resources/application.properties index ed844cadf8..9111491b58 100644 --- a/spring-kafka-2/src/main/resources/application.properties +++ b/spring-kafka-2/src/main/resources/application.properties @@ -19,4 +19,8 @@ kafka.backoff.max_failure=5 # multiple listeners properties multiple-listeners.books.topic.name=books +spring.kafka.streams.application-id=baeldung-streams +spring.kafka.consumer.group-id=baeldung-group +spring.kafka.streams.properties[default.key.serde]=org.apache.kafka.common.serialization.Serdes$StringSerde +kafka.topics.iot=iot_sensor_data From f33372e091a921a22e616f50e088820693130c79 Mon Sep 17 00:00:00 2001 From: hmdrz Date: Thu, 9 Nov 2023 11:21:54 +0330 Subject: [PATCH 439/831] #BAEL-7157: add one extra method --- .../test/java/com/baeldung/testsuite/ClassOneUnitTest.java | 4 ++++ .../com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java index 4ce092796e..cfb77c8d41 100644 --- a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/ClassOneUnitTest.java @@ -10,4 +10,8 @@ public class ClassOneUnitTest { Assertions.assertTrue(true); } + @Test + public void whenFalse_thenFalse() { + Assertions.assertFalse(false); + } } diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java index bb63fcda63..be5b3380c7 100644 --- a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/subpackage/ClassTwoUnitTest.java @@ -8,4 +8,9 @@ public class ClassTwoUnitTest { public void whenTrue_thenTrue() { Assertions.assertTrue(true); } + + @Test + public void whenFalse_thenFalse() { + Assertions.assertFalse(false); + } } From b6d28c44461e31609295637e87de8e7b463652fb Mon Sep 17 00:00:00 2001 From: hmdrz Date: Thu, 9 Nov 2023 11:22:14 +0330 Subject: [PATCH 440/831] #BAEL-7157: add main test suite --- .../testsuite/suites/JUnitSelectMethodsSuite.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectMethodsSuite.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectMethodsSuite.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectMethodsSuite.java new file mode 100644 index 0000000000..e0d17dc0e4 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/testsuite/suites/JUnitSelectMethodsSuite.java @@ -0,0 +1,14 @@ +package com.baeldung.testsuite.suites; + +import com.baeldung.testsuite.ClassOneUnitTest; +import org.junit.platform.suite.api.SelectMethod; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +@Suite +@SuiteDisplayName("My Test Suite") +@SelectMethod(type = ClassOneUnitTest.class, name = "whenFalse_thenFalse") +@SelectMethod("com.baeldung.testsuite.subpackage.ClassTwoUnitTest#whenFalse_thenFalse") +public class JUnitSelectMethodsSuite { + // runs ClassOneUnitTest and ClassTwoUnitTest +} \ No newline at end of file From 75a64be865bd573134dce88a48582e44ebca7e1a Mon Sep 17 00:00:00 2001 From: hmdrz Date: Thu, 9 Nov 2023 11:22:48 +0330 Subject: [PATCH 441/831] #BAEL-7157: upgrade dependency version and add extra dependencies --- testing-modules/junit-5-advanced/pom.xml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index 3ae62eac2e..411f189638 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -45,7 +45,18 @@ ${junit-platform.version} test - + + org.junit.platform + junit-platform-launcher + ${junit-platform.version} + test + + + org.junit.platform + junit-platform-commons + ${junit-platform.version} + test + @@ -70,7 +81,7 @@ 1.49 3.24.2 - 1.9.2 + 1.10.1 3.0.0 From 781b7fde457d67c1549ec8f12d90c0dde15b6c05 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 9 Nov 2023 15:27:46 +0530 Subject: [PATCH 442/831] JAVA-27244: Changes made removing comment from modules that are added already (#15161) --- pom.xml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index a16fabebc5..ffd39b7ea2 100644 --- a/pom.xml +++ b/pom.xml @@ -362,7 +362,7 @@ web-modules/java-lite persistence-modules/deltaspike persistence-modules/hibernate-ogm - persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-cassandra-reactive java-nashorn jeromq spring-ejb-modules/ejb-beans @@ -533,7 +533,7 @@ web-modules/java-lite persistence-modules/deltaspike persistence-modules/hibernate-ogm - persistence-modules/spring-data-cassandra-reactive + persistence-modules/spring-data-cassandra-reactive java-nashorn jeromq spring-ejb-modules/ejb-beans @@ -854,7 +854,7 @@ libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io - libraries-data-2 + libraries-data-2 libraries-data-io libraries-files libraries-http @@ -929,7 +929,7 @@ gcp-firebase spring-di-4 spring-kafka-2 - + libraries-llms spring-pulsar @@ -1039,14 +1039,6 @@ core-java-modules gcp-firebase - - - - - - - - spring-aop spring-aop-2 custom-pmd @@ -1138,7 +1130,7 @@ libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io - libraries-data-2 + libraries-data-2 libraries-data-io libraries-files libraries-http @@ -1212,7 +1204,7 @@ spring-actuator spring-di-4 spring-kafka-2 - + libraries-llms spring-pulsar From 4145926d9421d1652383606066a2ee84cb398652 Mon Sep 17 00:00:00 2001 From: gaepi Date: Thu, 9 Nov 2023 11:55:32 +0100 Subject: [PATCH 443/831] JAVA-27245 - renamed modules. --- .../spring-cloud-bootstrap/README.md | 2 +- .../spring-cloud-bootstrap/pom.xml | 4 ++-- .../{svc-book => zipkin-log-svc-book}/pom.xml | 4 ++-- .../bootstrap/svcbook/BookServiceApplication.java | 0 .../cloud/bootstrap/svcbook/CookieConfig.java | 0 .../spring/cloud/bootstrap/svcbook/DataLoader.java | 0 .../cloud/bootstrap/svcbook/SecurityConfig.java | 0 .../cloud/bootstrap/svcbook/SessionConfig.java | 0 .../spring/cloud/bootstrap/svcbook/book/Book.java | 0 .../bootstrap/svcbook/book/BookController.java | 0 .../svcbook/book/BookNotFoundException.java | 0 .../bootstrap/svcbook/book/BookRepository.java | 0 .../cloud/bootstrap/svcbook/book/BookService.java | 0 .../src/main/resources/bootstrap.properties | 0 .../src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../{svc-rating => zipkin-log-svc-rating}/pom.xml | 4 ++-- .../cloud/bootstrap/svcrating/CookieConfig.java | 0 .../cloud/bootstrap/svcrating/DataLoader.java | 0 .../svcrating/RatingServiceApplication.java | 0 .../cloud/bootstrap/svcrating/SecurityConfig.java | 0 .../cloud/bootstrap/svcrating/SessionConfig.java | 0 .../cloud/bootstrap/svcrating/rating/Rating.java | 0 .../svcrating/rating/RatingCacheRepository.java | 0 .../svcrating/rating/RatingController.java | 0 .../svcrating/rating/RatingNotFoundException.java | 0 .../svcrating/rating/RatingRepository.java | 0 .../bootstrap/svcrating/rating/RatingService.java | 0 .../src/main/resources/bootstrap.properties | 0 .../src/main/resources/logback.xml | 0 .../java/com/baeldung/SpringContextLiveTest.java | 0 .../src/test/resources/bootstrap.properties | 0 .../kubernetes-minikube/demo-backend/Dockerfile | 5 ----- .../kubernetes-minikube/demo-frontend/Dockerfile | 5 ----- .../.gitignore | 0 .../minikube-demo-backend/Dockerfile | 5 +++++ .../pom.xml | 4 ++-- .../backend/KubernetesBackendApplication.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../.gitignore | 0 .../minikube-demo-frontend/Dockerfile | 5 +++++ .../pom.xml | 4 ++-- .../frontend/KubernetesFrontendApplication.java | 2 +- .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../object-configurations/backend-deployment.yaml | 14 +++++++------- .../object-configurations/frontend-deployment.yaml | 14 +++++++------- .../kubernetes-minikube/pom.xml | 4 ++-- 52 files changed, 38 insertions(+), 38 deletions(-) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/pom.xml (96%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/CookieConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/main/resources/logback.xml (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-book => zipkin-log-svc-book}/src/test/resources/bootstrap.properties (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/pom.xml (97%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/CookieConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/resources/bootstrap.properties (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/main/resources/logback.xml (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/test/java/com/baeldung/SpringContextLiveTest.java (100%) rename spring-cloud-modules/spring-cloud-bootstrap/{svc-rating => zipkin-log-svc-rating}/src/test/resources/bootstrap.properties (100%) delete mode 100644 spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile delete mode 100644 spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-backend}/.gitignore (100%) create mode 100644 spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/Dockerfile rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-backend}/pom.xml (91%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-backend}/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-backend}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-backend}/src/main/resources/logback.xml (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-backend}/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-frontend}/.gitignore (100%) create mode 100644 spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/Dockerfile rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-backend => minikube-demo-frontend}/pom.xml (91%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-frontend}/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java (95%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-frontend}/src/main/resources/application.properties (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-frontend}/src/main/resources/logback.xml (100%) rename spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/{demo-frontend => minikube-demo-frontend}/src/test/java/com/baeldung/SpringContextTest.java (100%) diff --git a/spring-cloud-modules/spring-cloud-bootstrap/README.md b/spring-cloud-modules/spring-cloud-bootstrap/README.md index 252058be1f..661dd7c647 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/README.md +++ b/spring-cloud-modules/spring-cloud-bootstrap/README.md @@ -21,4 +21,4 @@ This module contains articles about bootstrapping Spring Cloud applications that - git commit -m "First commit" - start the config server - start the discovery server - - start all the other servers in any order (gateway, svc-book, svc-rating, zipkin) + - start all the other servers in any order (gateway, zipkin-log-svc-book, zipkin-log-svc-rating, zipkin) diff --git a/spring-cloud-modules/spring-cloud-bootstrap/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/pom.xml index f4d4073ef1..73b07c826f 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/pom.xml @@ -19,8 +19,8 @@ discovery gateway gateway-2 - svc-book - svc-rating + zipkin-log-svc-book + zipkin-log-svc-rating customer-service order-service diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/pom.xml similarity index 96% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/pom.xml index c973968a70..2a6196b92b 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/pom.xml @@ -4,9 +4,9 @@ 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.cloud - svc-book + zipkin-log-svc-book 1.0.0-SNAPSHOT - svc-book + zipkin-log-svc-book com.baeldung diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/BookServiceApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/CookieConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/CookieConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/CookieConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/CookieConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/DataLoader.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/Book.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookNotFoundException.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/java/com/baeldung/spring/cloud/bootstrap/svcbook/book/BookService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-book/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-book/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/pom.xml similarity index 97% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/pom.xml index 29ebb4c4bc..54572eeea2 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/pom.xml @@ -4,9 +4,9 @@ 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.cloud - svc-rating + zipkin-log-svc-rating 1.0.0-SNAPSHOT - svc-rating + zipkin-log-svc-rating com.baeldung diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/CookieConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/CookieConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/CookieConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/CookieConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/DataLoader.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingController.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingNotFoundException.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingRepository.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java diff --git a/spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties b/spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/test/resources/bootstrap.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-bootstrap/svc-rating/src/test/resources/bootstrap.properties rename to spring-cloud-modules/spring-cloud-bootstrap/zipkin-log-svc-rating/src/test/resources/bootstrap.properties diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile deleted file mode 100644 index a0a9d57662..0000000000 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM openjdk:8-jdk-alpine -VOLUME /tmp -COPY target/demo-backend-1.0-SNAPSHOT.jar app.jar -ENV JAVA_OPTS="" -ENTRYPOINT exec java -jar /app.jar --debug \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile deleted file mode 100644 index 69adb03a17..0000000000 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM openjdk:8-jdk-alpine -VOLUME /tmp -COPY target/demo-frontend-1.0-SNAPSHOT.jar app.jar -ENV JAVA_OPTS="" -ENTRYPOINT exec java -jar /app.jar \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/.gitignore b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/.gitignore similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/.gitignore rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/.gitignore diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/Dockerfile b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/Dockerfile new file mode 100644 index 0000000000..fad9c11a73 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +COPY target/minikube-demo-backend-1.0-SNAPSHOT.jar app.jar +ENV JAVA_OPTS="" +ENTRYPOINT exec java -jar /app.jar --debug \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/pom.xml similarity index 91% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/pom.xml index 85eb944b27..c08c6a5a9d 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/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 - demo-frontend - demo-frontend + minikube-demo-backend + minikube-demo-backend com.baeldung.spring.cloud diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-backend/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/.gitignore b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/.gitignore similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/.gitignore rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/.gitignore diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/Dockerfile b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/Dockerfile new file mode 100644 index 0000000000..207114b1b5 --- /dev/null +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +COPY target/minikube-demo-frontend-1.0-SNAPSHOT.jar app.jar +ENV JAVA_OPTS="" +ENTRYPOINT exec java -jar /app.jar \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/pom.xml similarity index 91% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/pom.xml index 2b3f849145..8140807606 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/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 - demo-backend - demo-backend + minikube-demo-frontend + minikube-demo-frontend com.baeldung.spring.cloud diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java similarity index 95% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java index 635a79e8bb..d76fcdfd5d 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java @@ -22,7 +22,7 @@ public class KubernetesFrontendApplication { RestTemplate restTemplate = new RestTemplate(); String resourceUrl - = "http://demo-backend:8080"; + = "http://minikube-demo-backend:8080"; ResponseEntity response = restTemplate.getForEntity(resourceUrl, String.class); return "Message from backend is: " + response.getBody(); diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/resources/application.properties similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/application.properties rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/resources/application.properties diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/resources/logback.xml similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/logback.xml rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/main/resources/logback.xml diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/minikube-demo-frontend/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml index a7e26a6ec5..bcfa80cd7f 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml @@ -1,10 +1,10 @@ kind: Service apiVersion: v1 metadata: - name: demo-backend + name: minikube-demo-backend spec: selector: - app: demo-backend + app: minikube-demo-backend tier: backend ports: - protocol: TCP @@ -14,22 +14,22 @@ spec: apiVersion: apps/v1 kind: Deployment metadata: - name: demo-backend + name: dminikube-demo-backend spec: selector: matchLabels: - app: demo-backend + app: minikube-demo-backend tier: backend replicas: 3 template: metadata: labels: - app: demo-backend + app: minikube-demo-backend tier: backend spec: containers: - - name: demo-backend - image: demo-backend:latest + - name: minikube-demo-backend + image: minikube-demo-backend:latest imagePullPolicy: Never ports: - containerPort: 8080 diff --git a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml index bf44dce21c..f96c7a1a9c 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml @@ -1,10 +1,10 @@ kind: Service apiVersion: v1 metadata: - name: demo-frontend + name: minikube-demo-frontend spec: selector: - app: demo-frontend + app: minikube-demo-frontend ports: - protocol: TCP port: 8081 @@ -14,20 +14,20 @@ spec: apiVersion: apps/v1 kind: Deployment metadata: - name: demo-frontend + name: minikube-demo-frontend spec: selector: matchLabels: - app: demo-frontend + app: minikube-demo-frontend replicas: 3 template: metadata: labels: - app: demo-frontend + app: minikube-demo-frontend spec: containers: - - name: demo-frontend - image: demo-frontend:latest + - name: minikube-demo-frontend + image: minikube-demo-frontend:latest imagePullPolicy: Never ports: - containerPort: 8081 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 b778ee1b57..1c7456d007 100644 --- a/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml +++ b/spring-cloud-modules/spring-cloud-kubernetes/kubernetes-minikube/pom.xml @@ -14,8 +14,8 @@ - demo-backend - demo-frontend + minikube-demo-backend + minikube-demo-frontend \ No newline at end of file From d1685c42bd9f2692f16dd5f86f837d4c9714f051 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 9 Nov 2023 16:47:34 +0530 Subject: [PATCH 444/831] JAVA-26001_D_M: Fix formatting of POMs for modules D to M (#14958) --- google-auto-project/pom.xml | 1 - json-modules/json-2/pom.xml | 4 ++-- .../jacoco-coverage-services-example/pom.xml | 7 +++---- maven-modules/jacoco-coverage-aggregation/pom.xml | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/google-auto-project/pom.xml b/google-auto-project/pom.xml index 034fea5aad..175e0c20c6 100644 --- a/google-auto-project/pom.xml +++ b/google-auto-project/pom.xml @@ -8,7 +8,6 @@ google-auto-project pom - com.baeldung parent-modules diff --git a/json-modules/json-2/pom.xml b/json-modules/json-2/pom.xml index 6cca576fb1..b9a75e8aff 100644 --- a/json-modules/json-2/pom.xml +++ b/json-modules/json-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 json-2 0.0.1-SNAPSHOT diff --git a/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml index 2c06694b46..223689f8ff 100644 --- a/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/jacoco-coverage-services-example/pom.xml @@ -13,8 +13,7 @@ jacoco-coverage-aggregation 1.0 - - + org.springframework @@ -28,7 +27,7 @@ test - + @@ -43,7 +42,7 @@ - + 5.9.2 6.0.11 diff --git a/maven-modules/jacoco-coverage-aggregation/pom.xml b/maven-modules/jacoco-coverage-aggregation/pom.xml index 70243973e8..6d1aab3c3d 100644 --- a/maven-modules/jacoco-coverage-aggregation/pom.xml +++ b/maven-modules/jacoco-coverage-aggregation/pom.xml @@ -21,7 +21,7 @@ jacoco-coverage-controllers-example jacoco-coverage-aggregate-report - + From 3fbd2eaab9561c4fa34d3b982c349e66c24de632 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Thu, 9 Nov 2023 16:48:02 +0530 Subject: [PATCH 445/831] JAVA-26001_Q_Z: Fix formatting of POMs for modules Q to Z (#14960) --- pom.xml | 4 +- spring-6-rsocket/pom.xml | 7 +- spring-aop-2/pom.xml | 94 +++++++++---------- .../spring-boot-3-testcontainers/pom.xml | 5 +- .../spring-boot-graalvm-docker/pom.xml | 61 ++++++------ .../spring-boot-jasypt/pom.xml | 3 +- .../spring-boot-ssl-bundles/pom.xml | 4 +- .../spring-boot-telegram/pom.xml | 4 +- .../spring-5-reactive/pom.xml | 0 .../spring-reactive-data-couchbase/pom.xml | 4 +- testing-modules/junit-5-basics-2/pom.xml | 9 +- 11 files changed, 100 insertions(+), 95 deletions(-) create mode 100644 spring-reactive-modules/spring-5-reactive/pom.xml diff --git a/pom.xml b/pom.xml index ffd39b7ea2..bb5a0c9e7b 100644 --- a/pom.xml +++ b/pom.xml @@ -344,7 +344,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang core-java-modules/core-java-lang-math-3 - + core-java-modules/core-java-streams-2 @@ -517,7 +517,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang core-java-modules/core-java-lang-math-3 - + core-java-modules/core-java-streams-2 diff --git a/spring-6-rsocket/pom.xml b/spring-6-rsocket/pom.xml index 0f9e63bc7e..7f88df01e2 100644 --- a/spring-6-rsocket/pom.xml +++ b/spring-6-rsocket/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.bealdung spring-6-rsocket @@ -16,7 +16,6 @@ - org.springframework.boot spring-boot-starter-rsocket @@ -66,9 +65,11 @@ + 3.1.3 1.4.11 2.0.9 + diff --git a/spring-aop-2/pom.xml b/spring-aop-2/pom.xml index 206e1d7d7c..f1257369e0 100644 --- a/spring-aop-2/pom.xml +++ b/spring-aop-2/pom.xml @@ -74,54 +74,54 @@ - - compile-time-weaving + + compile-time-weaving - - - org.springframework - spring-aspects - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - com.baeldung.selfinvocation.CompileTimeWeavingIntegrationTest - - - - - org.codehaus.mojo - aspectj-maven-plugin - ${aspectj-plugin.version} - - ${java.version} - ${java.version} - ${java.version} - ignore - UTF-8 - - - org.springframework - spring-aspects - - - - - - - compile - - - - - - - + + + org.springframework + spring-aspects + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + com.baeldung.selfinvocation.CompileTimeWeavingIntegrationTest + + + + + org.codehaus.mojo + aspectj-maven-plugin + ${aspectj-plugin.version} + + ${java.version} + ${java.version} + ${java.version} + ignore + UTF-8 + + + org.springframework + spring-aspects + + + + + + + compile + + + + + + + load-time-weaving diff --git a/spring-boot-modules/spring-boot-3-testcontainers/pom.xml b/spring-boot-modules/spring-boot-3-testcontainers/pom.xml index 173fb8795c..d24da58742 100644 --- a/spring-boot-modules/spring-boot-3-testcontainers/pom.xml +++ b/spring-boot-modules/spring-boot-3-testcontainers/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-boot-3-testcontainers 0.0.1-SNAPSHOT @@ -16,7 +16,6 @@ - org.springframework.boot spring-boot-starter diff --git a/spring-boot-modules/spring-boot-graalvm-docker/pom.xml b/spring-boot-modules/spring-boot-graalvm-docker/pom.xml index a3a1b148c2..253e8fceb6 100644 --- a/spring-boot-modules/spring-boot-graalvm-docker/pom.xml +++ b/spring-boot-modules/spring-boot-graalvm-docker/pom.xml @@ -1,41 +1,44 @@ - + 4.0.0 - - - com.baeldung - parent-boot-3 - 0.0.1-SNAPSHOT - ../../parent-boot-3 - - com.baeldung spring-boot-graalvm-docker 1.0.0 spring-boot-graalvm-docker Spring Boot GrralVM with Docker + + + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 + + - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-test - test - + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + - - - org.graalvm.buildtools - native-maven-plugin - - - org.springframework.boot - spring-boot-maven-plugin - - + + + org.graalvm.buildtools + native-maven-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-modules/spring-boot-jasypt/pom.xml b/spring-boot-modules/spring-boot-jasypt/pom.xml index 70bbe35319..0f9ad72b64 100644 --- a/spring-boot-modules/spring-boot-jasypt/pom.xml +++ b/spring-boot-modules/spring-boot-jasypt/pom.xml @@ -27,7 +27,7 @@ com.github.ulisesbocchio - jasypt-spring-boot-starter + jasypt-spring-boot-starter ${jasypt.version} @@ -49,4 +49,5 @@ 3.0.5 + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-ssl-bundles/pom.xml b/spring-boot-modules/spring-boot-ssl-bundles/pom.xml index 770d8c2f01..1f4e58f21f 100644 --- a/spring-boot-modules/spring-boot-ssl-bundles/pom.xml +++ b/spring-boot-modules/spring-boot-ssl-bundles/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-boot-ssl-bundles spring-boot-ssl-bundles diff --git a/spring-boot-modules/spring-boot-telegram/pom.xml b/spring-boot-modules/spring-boot-telegram/pom.xml index 67fdf197f8..9077e90400 100644 --- a/spring-boot-modules/spring-boot-telegram/pom.xml +++ b/spring-boot-modules/spring-boot-telegram/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baelding spring-boot-telegram diff --git a/spring-reactive-modules/spring-5-reactive/pom.xml b/spring-reactive-modules/spring-5-reactive/pom.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index a7481d8aca..2ac8ad19ac 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/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 spring-reactive-data-couchbase spring-reactive-data-couchbase diff --git a/testing-modules/junit-5-basics-2/pom.xml b/testing-modules/junit-5-basics-2/pom.xml index 85b6c707fb..b430161380 100644 --- a/testing-modules/junit-5-basics-2/pom.xml +++ b/testing-modules/junit-5-basics-2/pom.xml @@ -1,16 +1,16 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + junit-5-basics-2 + com.baeldung parent-modules 1.0.0-SNAPSHOT - junit-5-basics-2 - commons-cli @@ -30,6 +30,7 @@ test + From bf5328c3970a508bbbb47257e5ea222363b27fa8 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 9 Nov 2023 14:39:49 +0200 Subject: [PATCH 446/831] JAVA-27237 Review log statements for projects | Week 44 | Manually Created (conti-1) --- .../src/main/resources/logback.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml index d944288ca4..1533b49c06 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/src/main/resources/logback.xml @@ -8,7 +8,9 @@ - + + + From 4cf46ce71908be7608b8a707feaca7e49f0213d3 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 9 Nov 2023 19:19:22 +0530 Subject: [PATCH 447/831] JAVA-27190 Upgrade hibernate validator version --- .../custom-validations-opeanpi-codegen/pom.xml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index b57a014a8f..573b132467 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -27,15 +27,10 @@ test - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} - - javax.validation - validation-api - ${validation-api.version} - org.openapitools openapi-generator @@ -97,8 +92,7 @@ 3.0.0 2.17.1 1.7.0 - 6.0.10.Final - 2.0.1.Final + 8.0.1.Final 3.3.4 2.10.0.pr3 5.1.0 From 52197768be4b9d9bf325a46eee5de4fde180984a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 9 Nov 2023 19:23:42 +0530 Subject: [PATCH 448/831] JAVA-27190 Remove code overriding parent-boot-version of hibernate-validator --- .../custom-validations-opeanpi-codegen/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index 573b132467..95d3239b96 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -26,11 +26,6 @@ spring-boot-starter-test test - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - org.openapitools openapi-generator @@ -92,7 +87,6 @@ 3.0.0 2.17.1 1.7.0 - 8.0.1.Final 3.3.4 2.10.0.pr3 5.1.0 From 499ed4bbbd64a3e778a908f1a218df18cb974479 Mon Sep 17 00:00:00 2001 From: Paul Greer Date: Thu, 9 Nov 2023 21:52:12 +0000 Subject: [PATCH 449/831] BAEL-6943: Difference between String and StringBuffer in Java (#14815) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Delete core-java-modules/core-java-lang-6/src/main/java/com/baeldung/intposneg directory * Delete core-java-modules/core-java-lang-6/src/test/java/com/baeldung/intposneg directory * Add files via upload * Delete core-java-modules/core-java-numbers-conversions/src/main/java/com/baeldung/stringtoint/intposneg directory * Add files via upload * Add files via upload * Delete core-java-modules/core-java-numbers-conversions/src/main/java/com/baeldung/intposneg directory * Delete core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/intposneg directory * Add files via upload * Add files via upload * Delete core-java-modules/core-java-lang-6/src/main/java/com/baeldung/diffstringstringbuffer directory * Delete core-java-modules/core-java-lang-6/src/test/java/com/baeldung/diffstringstringbuffer directory * Delete core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/diffstringstringbuffer directory * Delete core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer directory * Add files via upload * Add files via upload --- .../diffstringstringbuffer/MemoryAddress.java | 33 +++++++++++++++++++ .../StringBufferUnitTest.java | 18 ++++++++++ .../StringUnitTest.java | 29 ++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/diffstringstringbuffer/MemoryAddress.java create mode 100644 core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringBufferUnitTest.java create mode 100644 core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringUnitTest.java diff --git a/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/diffstringstringbuffer/MemoryAddress.java b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/diffstringstringbuffer/MemoryAddress.java new file mode 100644 index 0000000000..42a4d9d4b4 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/main/java/com/baeldung/diffstringstringbuffer/MemoryAddress.java @@ -0,0 +1,33 @@ +package com.baeldung.diffstringstringbuffer; + +import java.lang.reflect.Field; + +import sun.misc.Unsafe; + +public class MemoryAddress { + public long getMemoryAddress(Object object) { + Object[] arrayOfObject = new Object[]{object}; + Unsafe unsafe = null; + try { + Field field = Unsafe.class.getDeclaredField("theUnsafe"); + field.setAccessible(true); + unsafe = (Unsafe) field.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + assert unsafe != null; + long arrayBaseOffset = unsafe.arrayBaseOffset(Object[].class); + int addressSize = unsafe.addressSize(); + long objectAddress; + if (addressSize == 4) { + objectAddress = unsafe.getInt(arrayOfObject, arrayBaseOffset); + } else { + if (addressSize == 8) { + objectAddress = unsafe.getLong(arrayOfObject, arrayBaseOffset); + } else { + throw new Error("Error: Size not supported: " + addressSize); + } + } + return objectAddress; + } +} diff --git a/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringBufferUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringBufferUnitTest.java new file mode 100644 index 0000000000..adbe69b65e --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringBufferUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.diffstringstringbuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class StringBufferUnitTest { + @Test + void whenStringBufferVariableIsReassigned_thenVariableRetainsOriginalMemoryAddress() { + MemoryAddress memoryAddress = new MemoryAddress(); + StringBuffer stringBuffer = new StringBuffer("DownTown"); + long address1 = memoryAddress.getMemoryAddress(stringBuffer); + stringBuffer.insert(0, "Coder"); + assertEquals(stringBuffer.toString(), "CoderDownTown"); + long address2 = memoryAddress.getMemoryAddress(stringBuffer); + assertEquals(address1, address2); + } +} diff --git a/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringUnitTest.java b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringUnitTest.java new file mode 100644 index 0000000000..bf1fcfeaf1 --- /dev/null +++ b/core-java-modules/core-java-string-apis-2/src/test/java/com/baeldung/diffstringstringbuffer/StringUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.diffstringstringbuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import org.junit.jupiter.api.Test; + +public class StringUnitTest { + @Test + void whenStringVariableIsReassigned_thenVariableGetsNewMemoryAddress() { + MemoryAddress memoryAddress = new MemoryAddress(); + String s1 = "DownTown"; + long address1 = memoryAddress.getMemoryAddress(s1); + s1 = "Coder"; + long address2 = memoryAddress.getMemoryAddress(s1); + assertNotEquals(address1, address2); + } + + @Test + void whenStringsAreIncludedInAStringBuffer_thenThoseStringsRemainImmutable() { + String s1 = "TopCat"; + StringBuffer stringBuffer = new StringBuffer("DownTown"); + stringBuffer.append(s1); + stringBuffer.reverse(); + assertNotEquals(s1, "taCpoT"); + stringBuffer.delete(0, 3); + assertEquals(s1, "TopCat"); + } +} From 0b0db24ebb0e028008722d698716e9d0a17452b8 Mon Sep 17 00:00:00 2001 From: psevestre Date: Thu, 9 Nov 2023 18:56:11 -0300 Subject: [PATCH 450/831] [BAEL-7044] Shared Memory Between Two JVMs (#15162) * [BAEL-4849] Article code * [BAEL-4968] Article code * [BAEL-4968] Article code * [BAEL-4968] Article code * [BAEL-4968] Remove extra comments * [BAEL-5258] Article Code * [BAEL-2765] PKCE Support for Secret Clients * [BAEL-5698] Article code * [BAEL-5698] Article code * [BAEL-5905] Initial code * [BAEL-5905] Article code * [BAEL-5905] Relocate article code to new module * [BAEL-6275] PostgreSQL NOTIFY/LISTEN * [BAEL-6275] Minor correction * BAEL-6138 * [BAEL-6138] WIP - LiveTest * [BAEL-6138] Tutorial Code * [BAEL-6138] Tutorial Code * [BAEL-6694] Article Code * [BAEL-7044] Tutorial code --------- Co-authored-by: Philippe Sevestre --- .../core-java-sun/shared-mem-test1.bat | 8 ++ .../core-java-sun/shared-mem-test2.bat | 10 ++ .../com/baeldung/sharedmem/ConsumerApp.java | 94 ++++++++++++++ .../sharedmem/ConsumerAppWithSpinLock.java | 119 ++++++++++++++++++ .../com/baeldung/sharedmem/ProducerApp.java | 89 +++++++++++++ .../sharedmem/ProducerAppWithSpinLock.java | 117 +++++++++++++++++ .../java/com/baeldung/sharedmem/SpinLock.java | 43 +++++++ 7 files changed, 480 insertions(+) create mode 100644 core-java-modules/core-java-sun/shared-mem-test1.bat create mode 100644 core-java-modules/core-java-sun/shared-mem-test2.bat create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerApp.java create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerAppWithSpinLock.java create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerApp.java create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerAppWithSpinLock.java create mode 100644 core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/SpinLock.java diff --git a/core-java-modules/core-java-sun/shared-mem-test1.bat b/core-java-modules/core-java-sun/shared-mem-test1.bat new file mode 100644 index 0000000000..148c51eb36 --- /dev/null +++ b/core-java-modules/core-java-sun/shared-mem-test1.bat @@ -0,0 +1,8 @@ +@rem This bat file starts the consumer and producer (more or less) at the same time +cd target\classes +rem start java --add-opens java.base/java.nio=ALL-UNNAMED com.baeldung.sharedmem.ProducerApp c:\lixo\sharedmem.bin 65536 +rem start java --add-opens java.base/java.nio=ALL-UNNAMED com.baeldung.sharedmem.ConsumerApp c:\lixo\sharedmem.bin 65536 +start %JAVA_HOME%\bin\java com.baeldung.sharedmem.ProducerApp c:\lixo\sharedmem.bin 65536 +start %JAVA_HOME%\bin\java com.baeldung.sharedmem.ConsumerApp c:\lixo\sharedmem.bin 65536 +cd .. +cd .. diff --git a/core-java-modules/core-java-sun/shared-mem-test2.bat b/core-java-modules/core-java-sun/shared-mem-test2.bat new file mode 100644 index 0000000000..7a7f8f7caa --- /dev/null +++ b/core-java-modules/core-java-sun/shared-mem-test2.bat @@ -0,0 +1,10 @@ +@rem This bat file starts the consumer and producer (more or less) at the same time +del target\sharedmem.bin +echo "" > target\sharedmem.bin +cd target\classes +rem start java --add-opens java.base/java.nio=ALL-UNNAMED com.baeldung.sharedmem.ProducerAppWithSpinLock ..\sharedmem.bin 65536 +rem start java --add-opens java.base/java.nio=ALL-UNNAMED com.baeldung.sharedmem.ConsumerAppWithSpinLock ..\sharedmem.bin 65536 +start %JAVA_HOME%\bin\java com.baeldung.sharedmem.ProducerAppWithSpinLock ..\sharedmem.bin 65536 +start %JAVA_HOME%\bin\java com.baeldung.sharedmem.ConsumerAppWithSpinLock ..\sharedmem.bin 65536 +cd .. +cd .. diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerApp.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerApp.java new file mode 100644 index 0000000000..1fbc02bee9 --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerApp.java @@ -0,0 +1,94 @@ +package com.baeldung.sharedmem; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Random; + +public class ConsumerApp { + + public static void main(String[] args) throws Exception { + + MessageDigest digest = MessageDigest.getInstance("SHA1"); + digest.digest(new byte[256]); + byte[] dummy = digest.digest(); + int hashLen = dummy.length; + + System.out.println("Starting consumer iterations..."); + + long size = Long.parseLong(args[1]); + MappedByteBuffer shm = createSharedMemory(args[0], size + hashLen); + long start = System.currentTimeMillis(); + long iterations = 0; + int capacity = shm.capacity(); + + long matchCount = 0; + long mismatchCount = 0; + byte[] expectedHash = new byte[hashLen]; + + while (System.currentTimeMillis() - start < 30_000) { + + for (int i = 0; i < capacity - hashLen; i++) { + byte value = shm.get(i); + digest.update(value); + } + + byte[] hash = digest.digest(); + shm.position(capacity-hashLen); + shm.get(expectedHash); + + if (Arrays.equals(hash, expectedHash)) { + matchCount++; + } else { + mismatchCount++; + } + + iterations++; + } + + System.out.printf("%d iterations run. matches=%d, mismatches=%d\n", iterations, matchCount, mismatchCount); + System.out.println("Press to exit"); + System.console() + .readLine(); + } + + private static MappedByteBuffer createSharedMemory(String path, long size) { + + try (FileChannel fc = (FileChannel) Files.newByteChannel( + new File(path).toPath(), + EnumSet.of( + StandardOpenOption.CREATE, + StandardOpenOption.SPARSE, + StandardOpenOption.WRITE, + StandardOpenOption.READ))) { + return fc.map(FileChannel.MapMode.READ_WRITE, 0, size); + + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + + private static long getBufferAddress(MappedByteBuffer shm) { + try { + Class cls = shm.getClass(); + Method maddr = cls.getMethod("address"); + maddr.setAccessible(true); + Long addr = (Long) maddr.invoke(shm); + if (addr == null) { + throw new RuntimeException("Unable to retrieve buffer's address"); + } + return addr; + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerAppWithSpinLock.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerAppWithSpinLock.java new file mode 100644 index 0000000000..fa91edda40 --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ConsumerAppWithSpinLock.java @@ -0,0 +1,119 @@ +package com.baeldung.sharedmem; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Random; + +public class ConsumerAppWithSpinLock { + + public static void main(String[] args) { + try { + // Small wait to ensure the Producer gets the first round. Otherwise the hash will be invalid + Thread.sleep(1000); + run(args); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + System.console() + .printf("Press to continue"); + System.console() + .readLine(); + } + } + + private static void run(String args[]) throws Exception { + + MessageDigest digest = MessageDigest.getInstance("SHA1"); + digest.digest(new byte[256]); + byte[] dummy = digest.digest(); + int hashLen = dummy.length; + + long size = Long.parseLong(args[1]); + MappedByteBuffer shm = createSharedMemory(args[0], size + hashLen); + long addr = getBufferAddress(shm); + + System.out.printf("Buffer address: 0x%08x\n", addr); + + Random rnd = new Random(); + + long start = System.currentTimeMillis(); + long iterations = 0; + int capacity = shm.capacity(); + System.out.println("Starting consumer iterations..."); + + long matchCount = 0; + long mismatchCount = 0; + byte[] expectedHash = new byte[hashLen]; + SpinLock lock = new SpinLock(addr); + + while (System.currentTimeMillis() - start < 30_000) { + + if (!lock.tryLock(5_000)) { + throw new RuntimeException("Unable to acquire lock"); + } + + try { + for (int i = 4; i < capacity - hashLen; i++) { + byte value = shm.get(i); + digest.update(value); + } + + byte[] hash = digest.digest(); + shm.position(capacity-hashLen); + shm.get(expectedHash); + + if (Arrays.equals(hash, expectedHash)) { + matchCount++; + } else { + mismatchCount++; + } + + iterations++; + } finally { + lock.unlock(); + } + } + + System.out.printf("%d iteractions run. matches=%d, mismatches=%d\n", iterations, matchCount, mismatchCount); + } + + private static MappedByteBuffer createSharedMemory(String path, long size) { + + try (FileChannel fc = (FileChannel) Files.newByteChannel( + new File(path).toPath(), + EnumSet.of( + StandardOpenOption.CREATE, + StandardOpenOption.SPARSE, + StandardOpenOption.WRITE, + StandardOpenOption.READ))) { + return fc.map(FileChannel.MapMode.READ_WRITE, 0, size); + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + + private static long getBufferAddress(MappedByteBuffer shm) { + try { + Class cls = shm.getClass(); + Method maddr = cls.getMethod("address"); + maddr.setAccessible(true); + Long addr = (Long) maddr.invoke(shm); + if (addr == null) { + throw new RuntimeException("Unable to retrieve buffer's address"); + } + return addr; + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerApp.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerApp.java new file mode 100644 index 0000000000..ab7ca4d859 --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerApp.java @@ -0,0 +1,89 @@ +package com.baeldung.sharedmem; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.EnumSet; +import java.util.Random; + +public class ProducerApp { + + + public static void main(String[] args) throws Exception { + + MessageDigest digest = MessageDigest.getInstance("SHA1"); + digest.digest(new byte[256]); + byte[] dummy = digest.digest(); + int hashLen = dummy.length; + + + long size = Long.parseLong(args[1]); + MappedByteBuffer shm = createSharedMemory(args[0], size + hashLen); + + System.out.println("Starting producer iterations..."); + + long start = System.currentTimeMillis(); + long iterations = 0; + int capacity = shm.capacity(); + Random rnd = new Random(); + + while(System.currentTimeMillis() - start < 30000) { + + for (int i = 0; i < capacity - hashLen; i++) { + byte value = (byte) (rnd.nextInt(256) & 0x00ff); + digest.update(value); + shm.put(i, value); + } + + // Write hash at the end + byte[] hash = digest.digest(); + shm.position(capacity - hashLen); + shm.put(hash); + iterations++; + } + + System.out.printf("%d iterations run\n", iterations); + System.out.println("Press to exit"); + System.console().readLine(); + + } + + private static long getBufferAddress(MappedByteBuffer shm) { + try { + Class cls = shm.getClass(); + Method maddr = cls.getMethod("address"); + maddr.setAccessible(true); + Long addr = (Long) maddr.invoke(shm); + if ( addr == null ) { + throw new RuntimeException("Unable to retrieve buffer's address"); + } + return addr; + } + catch( NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + private static MappedByteBuffer createSharedMemory(String path, long size) { + + try (FileChannel fc = (FileChannel)Files.newByteChannel(new File(path).toPath(), + EnumSet.of( + StandardOpenOption.CREATE, + StandardOpenOption.SPARSE, + StandardOpenOption.WRITE, + StandardOpenOption.READ))) { + + return fc.map(FileChannel.MapMode.READ_WRITE, 0, size); + } + catch( IOException ioe) { + throw new RuntimeException(ioe); + } + } + +} diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerAppWithSpinLock.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerAppWithSpinLock.java new file mode 100644 index 0000000000..619955eb2d --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/ProducerAppWithSpinLock.java @@ -0,0 +1,117 @@ +package com.baeldung.sharedmem; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.EnumSet; +import java.util.Random; + +public class ProducerAppWithSpinLock { + + public static void main(String[] args) { + try { + run(args); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + System.console() + .printf("Press to continue"); + System.console() + .readLine(); + } + } + + + public static void run(String[] args) throws Exception { + + MessageDigest digest = MessageDigest.getInstance("SHA1"); + digest.digest(new byte[256]); + byte[] dummy = digest.digest(); + int hashLen = dummy.length; + + + long size = Long.parseLong(args[1]); + MappedByteBuffer shm = createSharedMemory(args[0], size + hashLen); + + // Cleanup lock area + shm.putInt(0,0); + + long addr = getBufferAddress(shm); + System.out.printf("Buffer address: 0x%08x\n",addr); + Random rnd = new Random(); + + long start = System.currentTimeMillis(); + long iterations = 0; + int capacity = shm.capacity(); + System.out.println("Starting producer iterations..."); + SpinLock lock = new SpinLock(addr); + while(System.currentTimeMillis() - start < 30000) { + + if(!lock.tryLock(5000)) { + throw new RuntimeException("Unable to acquire lock"); + } + + try { + // Skip the first 4 bytes, as they're used by the lock + for (int i = 4; i < capacity - hashLen; i++) { + byte value = (byte) (rnd.nextInt(256) & 0x00ff); + digest.update(value); + shm.put(i, value); + } + + // Write hash at the end + byte[] hash = digest.digest(); + shm.position(capacity-hashLen); + shm.put(hash); + iterations++; + } + finally { + lock.unlock(); + } + } + + System.out.printf("%d iterations run\n", iterations); + + } + + private static long getBufferAddress(MappedByteBuffer shm) { + try { + Class cls = shm.getClass(); + Method maddr = cls.getMethod("address"); + maddr.setAccessible(true); + Long addr = (Long) maddr.invoke(shm); + if ( addr == null ) { + throw new RuntimeException("Unable to retrieve buffer's address"); + } + return addr; + } + catch( NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + private static MappedByteBuffer createSharedMemory(String path, long size) { + + try (FileChannel fc = (FileChannel)Files.newByteChannel(new File(path).toPath(), + EnumSet.of( + StandardOpenOption.CREATE, + StandardOpenOption.SPARSE, + StandardOpenOption.WRITE, + StandardOpenOption.READ))) { + + return fc.map(FileChannel.MapMode.READ_WRITE, 0, size); + + } + catch( IOException ioe) { + throw new RuntimeException(ioe); + } + + } + +} diff --git a/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/SpinLock.java b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/SpinLock.java new file mode 100644 index 0000000000..145ac1e121 --- /dev/null +++ b/core-java-modules/core-java-sun/src/main/java/com/baeldung/sharedmem/SpinLock.java @@ -0,0 +1,43 @@ +package com.baeldung.sharedmem; + +//import sun.misc.Unsafe; + +import java.lang.reflect.Field; + +import sun.misc.Unsafe; + +public class SpinLock { + private static final Unsafe unsafe; + + static { + try { + Field f = Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + unsafe = (Unsafe) f.get(null); + } + catch(NoSuchFieldException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } + } + + private final long addr; + + public SpinLock(long addr) { + this.addr = addr; + } + + public boolean tryLock(long maxWait) { + long deadline = System.currentTimeMillis() + maxWait; + while(System.currentTimeMillis() < deadline ) { + if ( unsafe.compareAndSwapInt(null,addr,0,1)) { + return true; + } + } + return false; + } + + public void unlock() { + unsafe.putInt(addr,0); + } + +} From 63679af8caa320ea547baa97a1d0c1e94fe69773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan=20Cardo=C5=9F?= <106325528+sodrac@users.noreply.github.com> Date: Fri, 10 Nov 2023 00:01:10 +0200 Subject: [PATCH 451/831] BAEL-6874 update test code for article (#15164) * BAEL-6819 convert from int to Long in Java * BAEL-6819 update package name * BAEL-6874 test code for article * BAEL-6874 rename test class * BAEL-6874 update test code for article * BAEL-6874 update test code for article --- .../GenericNumbersComparatorUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java index 0fcc0f3453..0b0295c2db 100644 --- a/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java +++ b/core-java-modules/core-java-numbers-6/src/test/java/com/baeldung/genericnumberscomparator/GenericNumbersComparatorUnitTest.java @@ -78,7 +78,7 @@ class GenericNumbersComparatorUnitTest { assertEquals(true, isEqual.test(5, 5.0)); } - private boolean someCondition = true; + private boolean someCondition; Function dynamicFunction = someCondition ? Number::doubleValue : Number::intValue; Comparator dynamicComparator = (num1, num2) -> ((Comparable) dynamicFunction.apply(num1)).compareTo(dynamicFunction.apply(num2)); From 1f609d3aafe8149885b06db927912d10e01a0362 Mon Sep 17 00:00:00 2001 From: Dmytro Budym <46810751+dbudim@users.noreply.github.com> Date: Fri, 10 Nov 2023 04:08:28 +0100 Subject: [PATCH 452/831] =?UTF-8?q?Code=20examples=20for=20article:=20Swit?= =?UTF-8?q?ching=20Between=20Frames=20Using=20Selenium=20We=E2=80=A6=20(#1?= =?UTF-8?q?4973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Code examples for article: Switching Between Frames Using Selenium WebDriver in Java * continuation indent 2 * moved to selenium-2 package --- .../selenium/iframe/IframeManualTest.java | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 testing-modules/selenium-2/src/test/java/com/baeldung/selenium/iframe/IframeManualTest.java diff --git a/testing-modules/selenium-2/src/test/java/com/baeldung/selenium/iframe/IframeManualTest.java b/testing-modules/selenium-2/src/test/java/com/baeldung/selenium/iframe/IframeManualTest.java new file mode 100644 index 0000000000..bc617a4777 --- /dev/null +++ b/testing-modules/selenium-2/src/test/java/com/baeldung/selenium/iframe/IframeManualTest.java @@ -0,0 +1,120 @@ +package com.baeldung.selenium.iframe; + +import io.github.bonigarcia.wdm.WebDriverManager; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.time.Duration; + + +public class IframeManualTest { + + private WebDriver driver; + private static final int TIMEOUT = 10; + + @BeforeMethod + public void init() { + WebDriverManager.chromedriver().setup(); + driver = new ChromeDriver(); + } + + @Test + public void whenSwitchToFrameUsingWebElement_thenSwitched() { + openDemoPage(); + WebElement iframeElement = driver.findElement(By.cssSelector("#myFrame2")); + + new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(iframeElement)); + waitForTextInFrame(); + } + + @Test + public void whenSwitchToFrameUsingName_thenSwitched() { + openDemoPage(); + new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frameName2")); + waitForTextInFrame(); + } + + @Test + public void whenSwitchToFrameUsingId_thenSwitched() { + openDemoPage(); + new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("myFrame2")); + waitForTextInFrame(); + } + + @Test + public void whenSwitchToInnerFrameFromOuter_thenSwitched() { + openPageWithNestedFrames(); + switchToNestedFrame(); + waitForLinkInNestedFrame(); + } + + @Test + public void whenSwitchToParentFrame_thenSwitched() { + openPageWithNestedFrames(); + switchToNestedFrame(); + driver.switchTo().parentFrame(); + waitForTextInParentFrame(); + } + + @Test + public void whenSwitchToDefaultContent_thenSwitched() { + openPageWithNestedFrames(); + switchToNestedFrame(); + driver.switchTo().defaultContent(); + waitForElementInDefaultContent(); + } + + @AfterMethod + public void tearDown() { + driver.quit(); + } + + + private void openDemoPage() { + driver.get("https://seleniumbase.io/demo_page"); + new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#myForm"))); + } + + private void openPageWithNestedFrames() { + driver.get("https://seleniumbase.io/w3schools/iframes"); + new WebDriverWait(driver, Duration.ofSeconds(10)) + .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#runbtn"))); + } + + private void switchToNestedFrame() { + driver.switchTo().frame("iframeResult"); + WebElement innerFrame = driver.findElement(By.cssSelector("[src='./demo_iframe.htm']")); + driver.switchTo().frame(innerFrame); + } + + private void waitForTextInFrame() { + new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)) + .until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("h4"), "iFrame Text")); + } + + private void waitForLinkInNestedFrame() { + new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)) + .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("[href='https://seleniumbase.io/w3schools/iframes.html']"))); + } + + private void waitForTextInParentFrame() { + new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)) + .until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector("h2"), "HTML Iframes (nested iframes)")); + } + + private void waitForElementInDefaultContent() { + new WebDriverWait(driver, Duration.ofSeconds(TIMEOUT)) + .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#runbtn"))); + } +} From 0ce0a647a112de2828e049762affbede65132b85 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 10 Nov 2023 04:10:03 -0300 Subject: [PATCH 453/831] MongoDbHashMapIntegrationTest - Changing to LiveTest (#15013) * changing to LiveTest Prevent integration tests from failing after spring boot upgrade. * Update MongoDbHashMapLiveTest.java Including docs. * Update MongoDbHashMapLiveTest.java removing instructions from atlas search. --- ...nTest.java => MongoDbHashMapLiveTest.java} | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) rename persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/{MongoDbHashMapIntegrationTest.java => MongoDbHashMapLiveTest.java} (76%) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapLiveTest.java similarity index 76% rename from persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java rename to persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapLiveTest.java index bbf425f277..29588df8a9 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapLiveTest.java @@ -13,21 +13,35 @@ import java.util.Map; import java.util.Set; import org.bson.Document; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; import com.mongodb.BasicDBObject; -@SpringBootTest +/** + * Steps to run locally: + * - Open embedded.properties and include: + * - spring.data.mongodb.uri= + * - spring.data.mongodb.database=sample_mflix + * + * Pre-requisites: + * - Following the steps to import the sample_mflix database + */ @DirtiesContext +@RunWith(SpringRunner.class) @TestPropertySource("/embedded.properties") -class MongoDbHashMapIntegrationTest { +@SpringBootTest(classes = SpringBootHashMapApplication.class) +class MongoDbHashMapLiveTest { + private static final String COLLECTION_NAME = "hashmap-test-collection"; private static final Map MAP = new HashMap<>(); private static final Set> MAP_SET = new HashSet<>(); @@ -52,17 +66,22 @@ class MongoDbHashMapIntegrationTest { MAP_SET.add(MAP); MAP_SET.add(otherMap); } + + @AfterEach + void destroy() { + mongo.dropCollection(COLLECTION_NAME); + } @Test void whenUsingMap_thenInsertSucceeds() { - Map saved = mongo.insert(MAP, "map-collection"); + Map saved = mongo.insert(MAP, COLLECTION_NAME); assertHasMongoId(saved); } @Test void whenMapSet_thenInsertSucceeds() { - Collection> saved = mongo.insert(MAP_SET, "map-set"); + Collection> saved = mongo.insert(MAP_SET, COLLECTION_NAME); saved.forEach(this::assertHasMongoId); assertEquals(2, saved.size()); @@ -72,7 +91,7 @@ class MongoDbHashMapIntegrationTest { void givenMap_whenDocumentConstructed_thenInsertSucceeds() { Document document = new Document(MAP); - Document saved = mongo.insert(document, "doc-collection"); + Document saved = mongo.insert(document, COLLECTION_NAME); assertHasMongoId(saved); } @@ -81,7 +100,7 @@ class MongoDbHashMapIntegrationTest { void givenMap_whenBasicDbObjectConstructed_thenInsertSucceeds() { BasicDBObject dbObject = new BasicDBObject(MAP); - BasicDBObject saved = mongo.insert(dbObject, "db-collection"); + BasicDBObject saved = mongo.insert(dbObject, COLLECTION_NAME); assertHasMongoId(saved); } @@ -114,7 +133,7 @@ class MongoDbHashMapIntegrationTest { set.add(document); }, Set::addAll); - Collection saved = mongo.insert(docs, "custom-set"); + Collection saved = mongo.insert(docs, COLLECTION_NAME); saved.forEach(this::assertHasMongoId); } } From faa689f0181bd108de1d1a880d4e71bfcead45d4 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Fri, 10 Nov 2023 08:15:20 +0100 Subject: [PATCH 454/831] [map-sort-by-value] sort map by value --- .../map/LinkedHashMapSortByValueUnitTest.java | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java new file mode 100644 index 0000000000..2508c1416d --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java @@ -0,0 +1,142 @@ +package com.baeldung.map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.junit.jupiter.api.Test; + +class Player { + private String name; + private Integer score = 0; + + public Player(String name, Integer score) { + this.name = name; + this.score = score; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Player)) { + return false; + } + + Player player = (Player) o; + + if (!Objects.equals(name, player.name)) { + return false; + } + return Objects.equals(score, player.score); + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (score != null ? score.hashCode() : 0); + return result; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } +} + +public class LinkedHashMapSortByValueUnitTest { + private static LinkedHashMap MY_MAP = new LinkedHashMap(); + + static { + MY_MAP.put("key a", 4); + MY_MAP.put("key b", 1); + MY_MAP.put("key c", 3); + MY_MAP.put("key d", 2); + MY_MAP.put("key e", 5); + } + + private static LinkedHashMap EXPECTED_MY_MAP = new LinkedHashMap(); + + static { + EXPECTED_MY_MAP.put("key b", 1); + EXPECTED_MY_MAP.put("key d", 2); + EXPECTED_MY_MAP.put("key c", 3); + EXPECTED_MY_MAP.put("key a", 4); + EXPECTED_MY_MAP.put("key e", 5); + } + + private static final LinkedHashMap PLAYERS = new LinkedHashMap(); + + static { + PLAYERS.put("player a", new Player("Eric", 9)); + PLAYERS.put("player b", new Player("Kai", 7)); + PLAYERS.put("player c", new Player("Amanda", 20)); + PLAYERS.put("player d", new Player("Kevin", 4)); + } + + private static final LinkedHashMap EXPECTED_PLAYERS = new LinkedHashMap(); + + static { + EXPECTED_PLAYERS.put("player d", new Player("Kevin", 4)); + EXPECTED_PLAYERS.put("player b", new Player("Kai", 7)); + EXPECTED_PLAYERS.put("player a", new Player("Eric", 9)); + EXPECTED_PLAYERS.put("player c", new Player("Amanda", 20)); + } + + @Test + void whenUsingCollectionSort_thenGetExpectedResult() { + List> entryList = new ArrayList<>(MY_MAP.entrySet()); + Collections.sort(entryList, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + return o1.getValue() + .compareTo(o2.getValue()); + } + }); + + LinkedHashMap result = new LinkedHashMap<>(); + for (Map.Entry e : entryList) { + result.put(e.getKey(), e.getValue()); + } + assertEquals(EXPECTED_MY_MAP, result); + } + + @Test + void whenUsingEntrycomparingByValueAndFillAMap_thenGetExpectedResult() { + LinkedHashMap result = new LinkedHashMap<>(); + MY_MAP.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue()) + .forEachOrdered(entry -> result.put(entry.getKey(), entry.getValue())); + assertEquals(EXPECTED_MY_MAP, result); + } + + @Test + void whenUsingEntrycomparingByValueAndCollect_thenGetExpectedResult() { + LinkedHashMap result = MY_MAP.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue()) + .collect(LinkedHashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), Map::putAll); + assertEquals(EXPECTED_MY_MAP, result); + } + + @Test + void whenUsingEntrycomparingByValueAndComparator_thenGetExpectedResult() { + LinkedHashMap result = PLAYERS.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue(Comparator.comparing(Player::getScore))) + .collect(LinkedHashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), Map::putAll); + assertEquals(EXPECTED_PLAYERS, result); + } + +} \ No newline at end of file From ac0fa6ff7883a610297aa7eb5561536a5e0e079f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 18:46:51 +0800 Subject: [PATCH 455/831] Update README.md [skip ci] --- core-java-modules/core-java-date-operations-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-date-operations-3/README.md b/core-java-modules/core-java-date-operations-3/README.md index 9d16d1f71c..48b68189fa 100644 --- a/core-java-modules/core-java-date-operations-3/README.md +++ b/core-java-modules/core-java-date-operations-3/README.md @@ -11,4 +11,5 @@ This module contains articles about date operations in Java. - [Getting Yesterday’s Date in Java](https://www.baeldung.com/java-find-yesterdays-date) - [How to Get the Start and End Dates of a Year Using Java](https://www.baeldung.com/java-date-year-start-end) - [Convert Between Java LocalDate and Epoch](https://www.baeldung.com/java-localdate-epoch) +- [Get First Date of Current Month in Java](https://www.baeldung.com/java-current-month-start-date) - [[<-- Prev]](/core-java-modules/core-java-date-operations-2) From 732c2255b294a38182581f016c31d524fa43f8eb Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 19:22:40 +0800 Subject: [PATCH 456/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-mvc/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md index f45feb6169..9257d6eba1 100644 --- a/spring-boot-modules/spring-boot-mvc/README.md +++ b/spring-boot-modules/spring-boot-mvc/README.md @@ -10,4 +10,5 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity) - [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) - [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) +- [Localized Validation Messages in REST](https://www.baeldung.com/rest-localized-validation-messages) - More articles: [[next -->]](/spring-boot-modules/spring-boot-mvc-2) From 77c7186351207bedb51336cce9d47cb06a93c693 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 19:27:58 +0800 Subject: [PATCH 457/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-3-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-3-2/README.md b/spring-boot-modules/spring-boot-3-2/README.md index c176de2310..27f9281725 100644 --- a/spring-boot-modules/spring-boot-3-2/README.md +++ b/spring-boot-modules/spring-boot-3-2/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Spring Boot 3.1’s ConnectionDetails Abstraction](https://www.baeldung.com/spring-boot-3-1-connectiondetails-abstraction) +- [@ConditionalOnThreading Annotation Spring](https://www.baeldung.com/spring-conditionalonthreading) From a2ad229e4e901972a6b8d7ca0b94b9f1837c4b3c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 19:37:26 +0800 Subject: [PATCH 458/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 5599187cd8..84cc94ad3c 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Difference Between putIfAbsent() and computeIfAbsent() in Java’s Map](https://www.baeldung.com/java-map-putifabsent-computeifabsent) - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) +- [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) From 9109481ecbcfcb4afc6b970debb02d3d2b5dbc9f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:51:11 +0000 Subject: [PATCH 459/831] =?UTF-8?q?[JAVA-26045]=20Upgraded=20spring-boot-t?= =?UTF-8?q?esting=20module=20to=20spring-boot=203=20ver=E2=80=A6=20(#14990?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-boot-modules/spring-boot-testing/pom.xml | 13 +++++++++---- .../boot/configurationproperties/MailServer.java | 10 +++++----- .../configuration/RedisProperties.java | 2 +- .../java/com/baeldung/boot/testing/Employee.java | 12 ++++++------ .../src/main/resources/application.properties | 4 ++-- .../exclude/ExcludeAutoConfig1IntegrationTest.java | 2 +- .../exclude/ExcludeAutoConfig2IntegrationTest.java | 2 +- .../exclude/ExcludeAutoConfig3IntegrationTest.java | 2 +- .../exclude/ExcludeAutoConfig4IntegrationTest.java | 2 +- .../boot/autoconfig/AutoConfigIntegrationTest.java | 2 +- .../PropertyValidationUnitTest.java | 4 ++-- .../boot/embeddedRedis/TestRedisConfiguration.java | 4 ++-- .../src/test/resources/application.properties | 4 ++-- 13 files changed, 34 insertions(+), 29 deletions(-) diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml index 257260fc3f..23277d11f3 100644 --- a/spring-boot-modules/spring-boot-testing/pom.xml +++ b/spring-boot-modules/spring-boot-testing/pom.xml @@ -9,9 +9,10 @@ This is simple boot application for demonstrating testing features. - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -67,6 +68,11 @@ ${embedded-redis.version} test + + io.rest-assured + rest-assured + test + @@ -122,7 +128,6 @@ 2.4-M1-groovy-4.0 3.0.0 0.7.2 - 2.5.0 2.17.1 diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java index e23b30759b..3f5ea64d24 100644 --- a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java @@ -2,11 +2,11 @@ package com.baeldung.boot.configurationproperties; import java.util.Map; -import javax.validation.Valid; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/embeddedRedis/configuration/RedisProperties.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/embeddedRedis/configuration/RedisProperties.java index 76f2e1bbfe..4e06548d79 100644 --- a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/embeddedRedis/configuration/RedisProperties.java +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/embeddedRedis/configuration/RedisProperties.java @@ -8,7 +8,7 @@ public class RedisProperties { private final int redisPort; private final String redisHost; - public RedisProperties(@Value("${spring.redis.port}") final int redisPort, @Value("${spring.redis.host}") final String redisHost) { + public RedisProperties(@Value("${spring.data.redis.port}") final int redisPort, @Value("${spring.data.redis.host}") final String redisHost) { this.redisPort = redisPort; this.redisHost = redisHost; } diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/testing/Employee.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/testing/Employee.java index 2921ecc609..cf68c45793 100644 --- a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/testing/Employee.java +++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/testing/Employee.java @@ -1,11 +1,11 @@ package com.baeldung.boot.testing; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.Size; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; import java.util.Date; @Entity diff --git a/spring-boot-modules/spring-boot-testing/src/main/resources/application.properties b/spring-boot-modules/spring-boot-testing/src/main/resources/application.properties index 70cae370a4..e3fe989efd 100644 --- a/spring-boot-modules/spring-boot-testing/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-testing/src/main/resources/application.properties @@ -1,6 +1,6 @@ # embedded redis -spring.redis.host= localhost -spring.redis.port= 6379 +spring.data.redis.host= localhost +spring.data.redis.port= 6379 # security spring.security.user.name=john diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java index 2ca0c74901..a8a322df44 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig1IntegrationTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java index c0bd6570a1..6a9e157827 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig2IntegrationTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java index 1642d4b932..9d4d9759d6 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig3IntegrationTest.java @@ -8,7 +8,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java index 1aa453348b..f28929fbef 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/autoconfig/exclude/ExcludeAutoConfig4IntegrationTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java index 44a02c0c80..447d174fb5 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/autoconfig/AutoConfigIntegrationTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.test.context.junit4.SpringRunner; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java index 939471dd67..5e70bcb45f 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java @@ -2,8 +2,8 @@ package com.baeldung.boot.configurationproperties; import static org.junit.jupiter.api.Assertions.assertEquals; -import javax.validation.Validation; -import javax.validation.Validator; +import jakarta.validation.Validation; +import jakarta.validation.Validator; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/embeddedRedis/TestRedisConfiguration.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/embeddedRedis/TestRedisConfiguration.java index c265d99c9b..10e5d56857 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/embeddedRedis/TestRedisConfiguration.java +++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/embeddedRedis/TestRedisConfiguration.java @@ -4,8 +4,8 @@ import com.baeldung.boot.embeddedRedis.configuration.RedisProperties; import org.springframework.boot.test.context.TestConfiguration; import redis.embedded.RedisServer; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; @TestConfiguration public class TestRedisConfiguration { diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/application.properties index 1810c7b1eb..bc31991329 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/resources/application.properties +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/application.properties @@ -1,6 +1,6 @@ #embedded redis -spring.redis.host= localhost -spring.redis.port= 6370 +spring.data.redis.host= localhost +spring.data.redis.port= 6370 # security spring.security.user.name=john spring.security.user.password=123 From 277001771c776c3f5c97d421339edf127ae4383e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:06:56 +0800 Subject: [PATCH 460/831] Update README.md [skip ci] --- core-java-modules/core-java-jndi/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-jndi/README.md b/core-java-modules/core-java-jndi/README.md index 9c6f489841..cdb1b34ca9 100644 --- a/core-java-modules/core-java-jndi/README.md +++ b/core-java-modules/core-java-jndi/README.md @@ -4,3 +4,4 @@ - [Java Naming and Directory Interface Overview](https://www.baeldung.com/jndi) - [LDAP Authentication Using Pure Java](https://www.baeldung.com/java-ldap-auth) - [Testing LDAP Connections With Java](https://www.baeldung.com/java-test-ldap-connections) +- [JNDI – What Is java:comp/env?](https://www.baeldung.com/java-jndi-comp-env) From c7883a6d5cd680bcc39cb23cfc924bb23a7ad03e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:10:20 +0800 Subject: [PATCH 461/831] Update README.md [skip ci] --- core-java-modules/core-java-documentation/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-documentation/README.md b/core-java-modules/core-java-documentation/README.md index 972e76c165..9fa48dc09e 100644 --- a/core-java-modules/core-java-documentation/README.md +++ b/core-java-modules/core-java-documentation/README.md @@ -4,3 +4,4 @@ - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Code Snippets in Java API Documentation](https://www.baeldung.com/java-doc-code-snippets) +- [How to Document Generic Type Parameters in Javadoc](https://www.baeldung.com/java-javadoc-generic-type-parameters) From 2e330d6f34016e25e451e97df3cc190a6c52e565 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:12:41 +0800 Subject: [PATCH 462/831] Update README.md [skip ci] --- core-java-modules/core-java-records/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-records/README.md b/core-java-modules/core-java-records/README.md index 86d3579c76..7b4df6f15c 100644 --- a/core-java-modules/core-java-records/README.md +++ b/core-java-modules/core-java-records/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Overriding hashCode() And equals() For Records](https://www.baeldung.com/java-override-hashcode-equals-records) +- [Optional as a Record Parameter in Java](https://www.baeldung.com/java-record-optional-param) From 4c87707c9057af9dc58a4443065a245c743c44e6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:16:16 +0800 Subject: [PATCH 463/831] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index 6c4fab384b..28e2dccd39 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -2,3 +2,4 @@ ### Relevant Articles: - [How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) - [Capitalize the First Letter of Each Word in a String](https://www.baeldung.com/java-string-initial-capital-letter-every-word) +- [Check if a String Contains Only Unicode Letters](https://www.baeldung.com/java-string-all-unicode-characters) From 47c755435251a26f72cdf64ed8d04b5c84aa3954 Mon Sep 17 00:00:00 2001 From: luca Date: Fri, 10 Nov 2023 14:30:22 +0100 Subject: [PATCH 464/831] feat: override spring bean --- .../com/baeldung/overridebean/Endpoint.java | 19 ++++++++++ .../com/baeldung/overridebean/Service.java | 5 +++ .../baeldung/overridebean/ServiceImpl.java | 8 ++++ .../overridebean/basic/Application.java | 14 +++++++ .../baeldung/overridebean/basic/Config.java | 16 ++++++++ .../overridebean/conditional/Application.java | 14 +++++++ .../conditional/ConditionalConfig.java | 18 +++++++++ .../overridebean/profile/Application.java | 14 +++++++ .../overridebean/profile/ProfileConfig.java | 18 +++++++++ .../src/main/resources/application.properties | 1 + .../conditional/ConditionIntegrationTest.java | 29 +++++++++++++++ .../conditional/ConditionalStub.java | 10 +++++ .../conditional/ConditionalTestConfig.java | 17 +++++++++ .../mockbean/MockBeanIntegrationTest.java | 37 +++++++++++++++++++ ...OverrideBeanDefinitionIntegrationTest.java | 31 ++++++++++++++++ .../OverrideBeanDefinitionServiceStub.java | 10 +++++ .../OverrideBeanDefinitionTestConfig.java | 15 ++++++++ .../primary/PrimaryIntegrationTest.java | 31 ++++++++++++++++ .../primary/PrimaryServiceStub.java | 10 +++++ .../primary/PrimaryTestConfig.java | 17 +++++++++ .../profile/ProfileIntegrationTest.java | 29 +++++++++++++++ .../profile/ProfileServiceStub.java | 10 +++++ .../profile/ProfileTestConfig.java | 15 ++++++++ 23 files changed, 388 insertions(+) create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Endpoint.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Service.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/ServiceImpl.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/ConditionalConfig.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/ProfileConfig.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalStub.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionServiceStub.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionTestConfig.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryServiceStub.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryTestConfig.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileServiceStub.java create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Endpoint.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Endpoint.java new file mode 100644 index 0000000000..e199d1f25b --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Endpoint.java @@ -0,0 +1,19 @@ +package com.baeldung.overridebean; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class Endpoint { + + private final Service service; + + public Endpoint(Service service) { + this.service = service; + } + + @GetMapping("/hello") + public String helloWorldEndpoint() { + return service.helloWorld(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Service.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Service.java new file mode 100644 index 0000000000..0872fcc372 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Service.java @@ -0,0 +1,5 @@ +package com.baeldung.overridebean; + +public interface Service { + String helloWorld(); +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/ServiceImpl.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/ServiceImpl.java new file mode 100644 index 0000000000..4d4b5582e6 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/ServiceImpl.java @@ -0,0 +1,8 @@ +package com.baeldung.overridebean; + +public class ServiceImpl implements Service { + + public String helloWorld() { + return "hello world"; + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java new file mode 100644 index 0000000000..6f9acde3d8 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.overridebean.basic; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java new file mode 100644 index 0000000000..67d999958d --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java @@ -0,0 +1,16 @@ +package com.baeldung.overridebean.basic; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.overridebean.Service; +import com.baeldung.overridebean.ServiceImpl; + +@Configuration +public class Config { + + @Bean + public Service helloWorld() { + return new ServiceImpl(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java new file mode 100644 index 0000000000..9c4cdbf8ec --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.overridebean.conditional; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/ConditionalConfig.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/ConditionalConfig.java new file mode 100644 index 0000000000..e18689e042 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/ConditionalConfig.java @@ -0,0 +1,18 @@ +package com.baeldung.overridebean.conditional; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.overridebean.Service; +import com.baeldung.overridebean.ServiceImpl; + +@Configuration +public class ConditionalConfig { + + @Bean + @ConditionalOnProperty(name = "service.stub", havingValue = "false") + public Service helloWorld() { + return new ServiceImpl(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java new file mode 100644 index 0000000000..d3298b2eb4 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.overridebean.profile; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/ProfileConfig.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/ProfileConfig.java new file mode 100644 index 0000000000..64cdfff8a5 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/ProfileConfig.java @@ -0,0 +1,18 @@ +package com.baeldung.overridebean.profile; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +import com.baeldung.overridebean.Service; +import com.baeldung.overridebean.ServiceImpl; + +@Configuration +@Profile("prod") +public class ProfileConfig { + + @Bean + public Service helloWorld() { + return new ServiceImpl(); + } +} 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 b628a708bd..0982b7bac0 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,2 +1,3 @@ keycloak.enabled=true spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8180/auth/realms/baeldung-api +service.stub=false \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java new file mode 100644 index 0000000000..5f6b1d128f --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung.overridebean.conditional; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; + +@SpringBootTest(classes = { Application.class, ConditionalConfig.class, Endpoint.class, ConditionalTestConfig.class }, properties = "service.stub=true") +@AutoConfigureMockMvc +class ConditionIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenConditionalConfig_whenServiceStubIsTrue_thenStubOk() throws Exception { + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello conditional stub"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalStub.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalStub.java new file mode 100644 index 0000000000..6b3e447108 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalStub.java @@ -0,0 +1,10 @@ +package com.baeldung.overridebean.conditional; + +import com.baeldung.overridebean.Service; + +public class ConditionalStub implements Service { + + public String helloWorld() { + return "hello conditional stub"; + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java new file mode 100644 index 0000000000..c48c4e2266 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.overridebean.conditional; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +import com.baeldung.overridebean.Service; + +@TestConfiguration +public class ConditionalTestConfig { + + @ConditionalOnProperty(name = "service.stub", havingValue = "true") + @Bean + public Service helloWorld() { + return new ConditionalStub(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java new file mode 100644 index 0000000000..6a7be1cbda --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java @@ -0,0 +1,37 @@ +package com.baeldung.overridebean.mockbean; + +import static org.hamcrest.Matchers.containsString; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.Service; +import com.baeldung.overridebean.basic.Application; + +@SpringBootTest(classes = { Application.class, Endpoint.class }) +@AutoConfigureMockMvc +class MockBeanIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private Service serviceExample; + + @Test + void givenServiceMockBean_whenGetHelloEndpoint_thenMockOk() throws Exception { + when(serviceExample.helloWorld()).thenReturn("hello mock bean"); + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello mock bean"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java new file mode 100644 index 0000000000..0f3753ef34 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.overridebean.overridebeandefinition; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.basic.Application; +import com.baeldung.overridebean.basic.Config; + +@SpringBootTest(classes = { Application.class, Config.class, Endpoint.class, OverrideBeanDefinitionTestConfig.class }, properties = "spring.main.allow-bean-definition-overriding=true") +@AutoConfigureMockMvc +class OverrideBeanDefinitionIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenNoProfile_whenAllowBeanDefinitionOverriding_thenStubOk() throws Exception { + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello no profile stub"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionServiceStub.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionServiceStub.java new file mode 100644 index 0000000000..d06b43cf24 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionServiceStub.java @@ -0,0 +1,10 @@ +package com.baeldung.overridebean.overridebeandefinition; + +import com.baeldung.overridebean.Service; + +public class OverrideBeanDefinitionServiceStub implements Service { + + public String helloWorld() { + return "hello no profile stub"; + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionTestConfig.java new file mode 100644 index 0000000000..5c35304296 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionTestConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.overridebean.overridebeandefinition; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +import com.baeldung.overridebean.Service; + +@TestConfiguration +public class OverrideBeanDefinitionTestConfig { + + @Bean + public Service helloWorld() { + return new OverrideBeanDefinitionServiceStub(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java new file mode 100644 index 0000000000..2bddfd4637 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.overridebean.primary; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.basic.Application; +import com.baeldung.overridebean.basic.Config; + +@SpringBootTest(classes = { Application.class, Config.class, Endpoint.class, PrimaryTestConfig.class }) +@AutoConfigureMockMvc +class PrimaryIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenTestConfiguration_whenPrimaryBeanIsDefined_thenStubOk() throws Exception { + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello primary stub"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryServiceStub.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryServiceStub.java new file mode 100644 index 0000000000..1d3d887f99 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryServiceStub.java @@ -0,0 +1,10 @@ +package com.baeldung.overridebean.primary; + +import com.baeldung.overridebean.Service; + +public class PrimaryServiceStub implements Service { + + public String helloWorld() { + return "hello primary stub"; + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryTestConfig.java new file mode 100644 index 0000000000..3765377b41 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryTestConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.overridebean.primary; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; + +import com.baeldung.overridebean.Service; + +@TestConfiguration +public class PrimaryTestConfig { + + @Primary + @Bean("service.stub") + public Service helloWorld() { + return new PrimaryServiceStub(); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java new file mode 100644 index 0000000000..deabfea9e5 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung.overridebean.profile; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; + +@SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) +@AutoConfigureMockMvc +class ProfileIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void givenConfigurationWithProfile_whenNoProductionProfileIsActive_thenStubOk() throws Exception { + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello profile stub"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileServiceStub.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileServiceStub.java new file mode 100644 index 0000000000..ef1f2e7a22 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileServiceStub.java @@ -0,0 +1,10 @@ +package com.baeldung.overridebean.profile; + +import com.baeldung.overridebean.Service; + +public class ProfileServiceStub implements Service { + + public String helloWorld() { + return "hello profile stub"; + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java new file mode 100644 index 0000000000..edd33162e0 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.overridebean.profile; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +import com.baeldung.overridebean.Service; + +@TestConfiguration +public class ProfileTestConfig { + + @Bean + public Service helloWorld() { + return new ProfileServiceStub(); + } +} From 1e13611b4de219f646c491eeb382e5a04bfac856 Mon Sep 17 00:00:00 2001 From: luca Date: Fri, 10 Nov 2023 15:09:18 +0100 Subject: [PATCH 465/831] Trigger Jenkins From 7c1065b494a05299addb9f0ada8fdba786ac91e4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:15:28 +0000 Subject: [PATCH 466/831] [JAVA-26439] Moved code related to "Guide to Stream.reduce()" to ebook module (#15170) --- .../streamreduce/application/Application.java | 62 ------------------- .../streamreduce/entities/Rating.java | 39 ------------ .../streamreduce/entities/Review.java | 28 --------- .../baeldung/streamreduce/entities/User.java | 30 --------- .../streamreduce/utilities/NumberUtils.java | 52 ---------------- .../streams/reduce/entities/User.java | 7 ++- .../reduce}/StreamReduceManualTest.java | 15 +++-- 7 files changed, 15 insertions(+), 218 deletions(-) delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java delete mode 100644 core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java rename core-java-modules/{core-java-8/src/test/java/com/baeldung/streamreduce/tests => core-java-streams-simple/src/test/java/com/baeldung/streams/reduce}/StreamReduceManualTest.java (95%) diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java deleted file mode 100644 index 00fc45ccae..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/application/Application.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.streamreduce.application; - -import com.baeldung.streamreduce.entities.User; -import com.baeldung.streamreduce.utilities.NumberUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class Application { - - public static void main(String[] args) { - List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); - int result1 = numbers.stream().reduce(0, (a, b) -> a + b); - System.out.println(result1); - - int result2 = numbers.stream().reduce(0, Integer::sum); - System.out.println(result2); - - List letters = Arrays.asList("a", "b", "c", "d", "e"); - String result3 = letters.stream().reduce("", (a, b) -> a + b); - System.out.println(result3); - - String result4 = letters.stream().reduce("", String::concat); - System.out.println(result4); - - String result5 = letters.stream().reduce("", (a, b) -> a.toUpperCase() + b.toUpperCase()); - System.out.println(result5); - - List users = Arrays.asList(new User("John", 30), new User("Julie", 35)); - int result6 = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); - System.out.println(result6); - - String result7 = letters.parallelStream().reduce("", String::concat); - System.out.println(result7); - - int result8 = users.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); - System.out.println(result8); - - List userList = new ArrayList<>(); - for (int i = 0; i <= 1000000; i++) { - userList.add(new User("John" + i, i)); - } - - long t1 = System.currentTimeMillis(); - int result9 = userList.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); - long t2 = System.currentTimeMillis(); - System.out.println(result9); - System.out.println("Sequential stream time: " + (t2 - t1) + "ms"); - - long t3 = System.currentTimeMillis(); - int result10 = userList.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum); - long t4 = System.currentTimeMillis(); - System.out.println(result10); - System.out.println("Parallel stream time: " + (t4 - t3) + "ms"); - - int result11 = NumberUtils.divideListElements(numbers, 1); - System.out.println(result11); - - int result12 = NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 0); - System.out.println(result12); - } -} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java deleted file mode 100644 index c4d0276256..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.streamreduce.entities; - -import java.util.ArrayList; -import java.util.List; - -public class Rating { - - double points; - List reviews = new ArrayList<>(); - - public Rating() {} - - public void add(Review review) { - reviews.add(review); - computeRating(); - } - - private double computeRating() { - double totalPoints = reviews.stream().map(Review::getPoints).reduce(0, Integer::sum); - this.points = totalPoints / reviews.size(); - return this.points; - } - - public static Rating average(Rating r1, Rating r2) { - Rating combined = new Rating(); - combined.reviews = new ArrayList<>(r1.reviews); - combined.reviews.addAll(r2.reviews); - combined.computeRating(); - return combined; - } - - public double getPoints() { - return points; - } - - public List getReviews() { - return reviews; - } -} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java deleted file mode 100644 index 03cde8a9c8..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.streamreduce.entities; - -public class Review { - - int points; - String review; - - public Review(int points, String review) { - this.points = points; - this.review = review; - } - - public int getPoints() { - return points; - } - - public void setPoints(int points) { - this.points = points; - } - - public String getReview() { - return review; - } - - public void setReview(String review) { - this.review = review; - } -} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java deleted file mode 100644 index 20c12d7920..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.streamreduce.entities; - -public class User { - - private final String name; - private final int age; - private final Rating rating = new Rating(); - - public User(String name, int age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public int getAge() { - return age; - } - - public Rating getRating() { - return rating; - } - - @Override - public String toString() { - return "User{" + "name=" + name + ", age=" + age + '}'; - } -} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java deleted file mode 100644 index a2325cc701..0000000000 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/utilities/NumberUtils.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.streamreduce.utilities; - -import java.util.List; -import java.util.function.BiFunction; -import java.util.logging.Level; -import java.util.logging.Logger; - -public abstract class NumberUtils { - - private static final Logger LOGGER = Logger.getLogger(NumberUtils.class.getName()); - - public static int divideListElements(List values, Integer divider) { - return values.stream() - .reduce(0, (a, b) -> { - try { - return a / divider + b / divider; - } catch (ArithmeticException e) { - LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero"); - } - return 0; - }); - } - - public static int divideListElementsWithExtractedTryCatchBlock(List values, int divider) { - return values.stream().reduce(0, (a, b) -> divide(a, divider) + divide(b, divider)); - } - - public static int divideListElementsWithApplyFunctionMethod(List values, int divider) { - BiFunction division = (a, b) -> a / b; - return values.stream().reduce(0, (a, b) -> applyFunction(division, a, divider) + applyFunction(division, b, divider)); - } - - private static int divide(int value, int factor) { - int result = 0; - try { - result = value / factor; - } catch (ArithmeticException e) { - LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero"); - } - return result; - } - - private static int applyFunction(BiFunction function, int a, int b) { - try { - return function.apply(a, b); - } - catch(Exception e) { - LOGGER.log(Level.INFO, "Exception occurred!"); - } - return 0; - } -} diff --git a/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java index 610bd93b22..07c627005a 100644 --- a/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java +++ b/core-java-modules/core-java-streams-simple/src/main/java/com/baeldung/streams/reduce/entities/User.java @@ -4,6 +4,7 @@ public class User { private final String name; private final int age; + private final Rating rating = new Rating(); public User(String name, int age) { this.name = name; @@ -17,7 +18,11 @@ public class User { public int getAge() { return age; } - + + public Rating getRating() { + return rating; + } + @Override public String toString() { return "User{" + "name=" + name + ", age=" + age + '}'; diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceManualTest.java similarity index 95% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java rename to core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceManualTest.java index 602bdd069e..2931384c94 100644 --- a/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/reduce/StreamReduceManualTest.java @@ -1,15 +1,18 @@ -package com.baeldung.streamreduce.tests; +package com.baeldung.streams.reduce; + +import static org.assertj.core.api.Assertions.assertThat; -import com.baeldung.streamreduce.entities.Rating; -import com.baeldung.streamreduce.entities.Review; -import com.baeldung.streamreduce.entities.User; -import com.baeldung.streamreduce.utilities.NumberUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; + import org.junit.Test; +import com.baeldung.streams.reduce.entities.Rating; +import com.baeldung.streams.reduce.entities.Review; +import com.baeldung.streams.reduce.entities.User; +import com.baeldung.streams.reduce.utilities.NumberUtils; + public class StreamReduceManualTest { @Test From cd9ab90fc857627079b9f57c7fc894fdd63f8669 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Fri, 10 Nov 2023 20:51:43 +0530 Subject: [PATCH 467/831] BAEL-7091 Moved to new module --- testing-modules/hamcrest/pom.xml | 12 ------------ testing-modules/testing-assertions/pom.xml | 12 ++++++++++++ .../assertnestedmap/AssertNestedMapUnitTest.java | 4 ++-- .../assertnestedmap/matchers/NestedMapMatcher.java | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) rename testing-modules/{hamcrest/src/test/java/com/baeldung/hamcrest => testing-assertions/src/test/java/com/baeldung}/assertnestedmap/AssertNestedMapUnitTest.java (95%) rename testing-modules/{hamcrest/src/test/java/com/baeldung/hamcrest => testing-assertions/src/test/java/com/baeldung}/assertnestedmap/matchers/NestedMapMatcher.java (94%) diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml index b5a8277deb..df8c543edb 100644 --- a/testing-modules/hamcrest/pom.xml +++ b/testing-modules/hamcrest/pom.xml @@ -6,18 +6,6 @@ hamcrest 0.0.1-SNAPSHOT hamcrest - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - jar diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml index 1da53bd77e..1f2b4e335d 100644 --- a/testing-modules/testing-assertions/pom.xml +++ b/testing-modules/testing-assertions/pom.xml @@ -4,6 +4,18 @@ 4.0.0 testing-assertions 0.0.1-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + com.baeldung diff --git a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java similarity index 95% rename from testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java rename to testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java index b5b4d652a0..7c48a5eb4a 100644 --- a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/AssertNestedMapUnitTest.java +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java @@ -1,11 +1,11 @@ -package com.baeldung.hamcrest.assertnestedmap; +package com.baeldung.assertnestedmap; import org.junit.jupiter.api.Test; import java.util.Map; -import static com.baeldung.hamcrest.assertnestedmap.matchers.NestedMapMatcher.hasNestedMapEntry; +import static com.baeldung.assertnestedmap.matchers.NestedMapMatcher.hasNestedMapEntry; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/matchers/NestedMapMatcher.java similarity index 94% rename from testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java rename to testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/matchers/NestedMapMatcher.java index 760edebb35..961130bb20 100644 --- a/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/assertnestedmap/matchers/NestedMapMatcher.java +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/matchers/NestedMapMatcher.java @@ -1,4 +1,4 @@ -package com.baeldung.hamcrest.assertnestedmap.matchers; +package com.baeldung.assertnestedmap.matchers; import org.hamcrest.Description; From 75828dbf491f828d41ba87e40461e0f566f38d62 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 07:29:30 +0800 Subject: [PATCH 468/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md index 1939e5ca3f..4869158d2b 100644 --- a/core-java-modules/core-java-collections-5/README.md +++ b/core-java-modules/core-java-collections-5/README.md @@ -8,4 +8,5 @@ - [Difference Between Arrays.sort() and Collections.sort()](https://www.baeldung.com/java-arrays-collections-sort-methods) - [Skipping the First Iteration in Java](https://www.baeldung.com/java-skip-first-iteration) - [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue) +- [Intro to Vector Class in Java](https://www.baeldung.com/java-vector-guide) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) From 373a0cc89552d42db973e41bf75166643e360c0b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 07:33:19 +0800 Subject: [PATCH 469/831] Update README.md [skip ci] --- reactor-core/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/reactor-core/README.md b/reactor-core/README.md index dccf1fa85c..96355ad703 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -13,3 +13,4 @@ This module contains articles about Reactor Core. - [Handling Exceptions in Project Reactor](https://www.baeldung.com/reactor-exceptions) - [Difference Between Flux.create and Flux.generate](https://www.baeldung.com/java-flux-create-generate) - [Difference Between Flux and Mono](https://www.baeldung.com/java-reactor-flux-vs-mono) +- [Working With MathFlux](https://www.baeldung.com/java-reactor-mathflux) From bb31624bb418edc1de9b99e67e25466d09a2b5f9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 07:43:24 +0800 Subject: [PATCH 470/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 84cc94ad3c..2e1531050e 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -2,3 +2,4 @@ - [Difference Between putIfAbsent() and computeIfAbsent() in Java’s Map](https://www.baeldung.com/java-map-putifabsent-computeifabsent) - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) +- [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) From 2c26effb6418f05b56dab0fc8c4a3d08714f2ea0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 07:49:53 +0800 Subject: [PATCH 471/831] Update README.md [skip ci] --- core-java-modules/core-java-8-datetime-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md index ac1e1ca81f..462a4be6f1 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -6,4 +6,5 @@ - [How Many Days Are There in a Particular Month of a Given Year?](https://www.baeldung.com/days-particular-month-given-year) - [Difference Between Instant and LocalDateTime](https://www.baeldung.com/java-instant-vs-localdatetime) - [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins) +- [Round the Date in Java](https://www.baeldung.com/java-round-the-date) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From d6638d328fd53d2ea1caddf767adbe461bf89416 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 07:57:45 +0800 Subject: [PATCH 472/831] Update README.md [skip ci] --- jersey/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/jersey/README.md b/jersey/README.md index aa5a6a3b28..24e39f02a2 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -12,3 +12,4 @@ This module contains articles about Jersey. - [Add a Header to a Jersey SSE Client Request](https://www.baeldung.com/jersey-sse-client-request-headers) - [Exception Handling With Jersey](https://www.baeldung.com/java-exception-handling-jersey) - [@FormDataParam vs. @FormParam in Jersey](https://www.baeldung.com/jersey-formdataparam-vs-formparam) +- [Add a List as Query Parameter in Jersey](https://www.baeldung.com/java-jersey-list-query-param) From 4e5f7adc81c748340b02d24f351b24fb15284b9f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:10:55 +0800 Subject: [PATCH 473/831] Update README.md [skip ci] --- core-java-modules/core-java-string-apis-2/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-apis-2/README.md b/core-java-modules/core-java-string-apis-2/README.md index 38bfb70ef1..57106b7151 100644 --- a/core-java-modules/core-java-string-apis-2/README.md +++ b/core-java-modules/core-java-string-apis-2/README.md @@ -6,4 +6,5 @@ This module contains articles about string APIs. - [Retain Only Digits and Decimal Separator in String](https://www.baeldung.com/java-string-retain-digits-decimal) - [Difference Between null and Empty String in Java](https://www.baeldung.com/java-string-null-vs-empty) - [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) -- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) \ No newline at end of file +- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) +- [Compare StringBuilder Objects in Java](https://www.baeldung.com/java-stringbuilder-objects-comparison) From 3d8d1ad9044b88604fbb961290816ec675ce588d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:16:39 +0800 Subject: [PATCH 474/831] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index 629d52f0a9..82a13a1eb6 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -5,3 +5,4 @@ - [Streams vs. Loops in Java](https://www.baeldung.com/java-streams-vs-loops) - [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream) - [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams) +- [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration) From c523d5b2019d1b7116c2182ff52da50c7825c486 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:21:22 +0800 Subject: [PATCH 475/831] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index 82a13a1eb6..64bc4e6b7a 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -6,3 +6,4 @@ - [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream) - [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams) - [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration) +- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) From 12fa2a39612a2c840d6262190e6e29767775ed2a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:27:08 +0800 Subject: [PATCH 476/831] Update README.md [skip ci] --- core-java-modules/core-java-date-operations-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-date-operations-3/README.md b/core-java-modules/core-java-date-operations-3/README.md index 48b68189fa..d8c321deab 100644 --- a/core-java-modules/core-java-date-operations-3/README.md +++ b/core-java-modules/core-java-date-operations-3/README.md @@ -12,4 +12,5 @@ This module contains articles about date operations in Java. - [How to Get the Start and End Dates of a Year Using Java](https://www.baeldung.com/java-date-year-start-end) - [Convert Between Java LocalDate and Epoch](https://www.baeldung.com/java-localdate-epoch) - [Get First Date of Current Month in Java](https://www.baeldung.com/java-current-month-start-date) +- [Time Conversions Using TimeUnit](https://www.baeldung.com/java-timeunit-conversion) - [[<-- Prev]](/core-java-modules/core-java-date-operations-2) From a6bed1817696343168204da250d308b200be4279 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 11 Nov 2023 08:31:26 +0800 Subject: [PATCH 477/831] Update README.md [skip ci] --- core-java-modules/core-java-string-apis-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-apis-2/README.md b/core-java-modules/core-java-string-apis-2/README.md index 57106b7151..c0b313d3b3 100644 --- a/core-java-modules/core-java-string-apis-2/README.md +++ b/core-java-modules/core-java-string-apis-2/README.md @@ -8,3 +8,4 @@ This module contains articles about string APIs. - [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) - [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) - [Compare StringBuilder Objects in Java](https://www.baeldung.com/java-stringbuilder-objects-comparison) +- [Finding the N-th Occurrence of a Substring in a String in Java](https://www.baeldung.com/java-locate-nth-match-substring) From 87018d44aedd2f215c1598aec8c782c01d38adbb Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 11 Nov 2023 06:55:11 +0200 Subject: [PATCH 478/831] [JAVA-26715] Upgraded pdfbox to latest version --- pdf-2/pom.xml | 2 +- .../pdfinfo/PdfInfoITextUnitTest.java | 22 ++++++++++--------- .../pdfinfo/PdfInfoPdfBoxUnitTest.java | 22 ++++++++++--------- pdf/pom.xml | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml index ccbb5c9693..2079ff70e5 100644 --- a/pdf-2/pom.xml +++ b/pdf-2/pom.xml @@ -51,7 +51,7 @@ 5.5.13.3 7.2.3 3.0.1 - 3.0.0-RC1 + 3.0.0 \ No newline at end of file diff --git a/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoITextUnitTest.java b/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoITextUnitTest.java index 422858d659..f54405a533 100644 --- a/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoITextUnitTest.java +++ b/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoITextUnitTest.java @@ -1,29 +1,31 @@ package com.baeldung.pdfinfo; -import org.junit.Assert; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import java.io.IOException; import java.util.Map; -public class PdfInfoITextUnitTest { +import org.junit.jupiter.api.Test; + +class PdfInfoITextUnitTest { private static final String PDF_FILE = "src/test/resources/input.pdf"; @Test - public void givenPdf_whenGetNumberOfPages_thenOK() throws IOException { - Assert.assertEquals(4, PdfInfoIText.getNumberOfPages(PDF_FILE)); + void givenPdf_whenGetNumberOfPages_thenOK() throws IOException { + assertEquals(4, PdfInfoIText.getNumberOfPages(PDF_FILE)); } @Test - public void givenPdf_whenIsPasswordRequired_thenOK() throws IOException { - Assert.assertFalse(PdfInfoIText.isPasswordRequired(PDF_FILE)); + void givenPdf_whenIsPasswordRequired_thenOK() throws IOException { + assertFalse(PdfInfoIText.isPasswordRequired(PDF_FILE)); } @Test - public void givenPdf_whenGetInfo_thenOK() throws IOException { + void givenPdf_whenGetInfo_thenOK() throws IOException { Map info = PdfInfoIText.getInfo(PDF_FILE); - Assert.assertEquals("LibreOffice 4.2", info.get("Producer")); - Assert.assertEquals("Writer", info.get("Creator")); + assertEquals("LibreOffice 4.2", info.get("Producer")); + assertEquals("Writer", info.get("Creator")); } } diff --git a/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoPdfBoxUnitTest.java b/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoPdfBoxUnitTest.java index 0fcbc7ee3c..5c4e5fc30d 100644 --- a/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoPdfBoxUnitTest.java +++ b/pdf-2/src/test/java/com/baeldung/pdfinfo/PdfInfoPdfBoxUnitTest.java @@ -1,29 +1,31 @@ package com.baeldung.pdfinfo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + import org.apache.pdfbox.pdmodel.PDDocumentInformation; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; -public class PdfInfoPdfBoxUnitTest { +class PdfInfoPdfBoxUnitTest { private static final String PDF_FILE = "src/test/resources/input.pdf"; @Test - public void givenPdf_whenGetNumberOfPages_thenOK() throws IOException { - Assert.assertEquals(4, PdfInfoPdfBox.getNumberOfPages(PDF_FILE)); + void givenPdf_whenGetNumberOfPages_thenOK() throws IOException { + assertEquals(4, PdfInfoPdfBox.getNumberOfPages(PDF_FILE)); } @Test - public void givenPdf_whenIsPasswordRequired_thenOK() throws IOException { - Assert.assertFalse(PdfInfoPdfBox.isPasswordRequired(PDF_FILE)); + void givenPdf_whenIsPasswordRequired_thenOK() throws IOException { + assertFalse(PdfInfoPdfBox.isPasswordRequired(PDF_FILE)); } @Test - public void givenPdf_whenGetInfo_thenOK() throws IOException { + void givenPdf_whenGetInfo_thenOK() throws IOException { PDDocumentInformation info = PdfInfoPdfBox.getInfo(PDF_FILE); - Assert.assertEquals("LibreOffice 4.2", info.getProducer()); - Assert.assertEquals("Writer", info.getCreator()); + assertEquals("LibreOffice 4.2", info.getProducer()); + assertEquals("Writer", info.getCreator()); } } diff --git a/pdf/pom.xml b/pdf/pom.xml index cead1b2ded..0fe90b6eb5 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -104,7 +104,7 @@ - 2.0.25 + 3.0.0 2.0.1 5.5.13.3 5.5.10 From 4062f3a1193017941523176517a90b94fcd1f707 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 11 Nov 2023 11:50:24 +0530 Subject: [PATCH 479/831] backlink updated --- spring-5-webflux-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5-webflux-2/README.md b/spring-5-webflux-2/README.md index 1b01f519a4..a0fafd903e 100644 --- a/spring-5-webflux-2/README.md +++ b/spring-5-webflux-2/README.md @@ -6,4 +6,4 @@ This module contains articles about Spring 5 WebFlux - [Spring Webflux and @Cacheable Annotation](https://www.baeldung.com/spring-webflux-cacheable) - [Comparison Between Mono’s doOnNext() and doOnSuccess()](https://www.baeldung.com/mono-doonnext-doonsuccess) - [How to Access the First Element of a Flux](https://www.baeldung.com/java-flux-first-element) -- [Using zipWhen() with Mono](https://www.baeldung.com/java-mono-zipwhen) +- [Using zipWhen() With Mono](https://www.baeldung.com/java-mono-zipwhen) From 173dd4bac3d78e7897274cd1a8625cad251846ff Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Sat, 11 Nov 2023 11:52:02 +0530 Subject: [PATCH 480/831] backlink updated --- persistence-modules/spring-data-jpa-query/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-query/README.md b/persistence-modules/spring-data-jpa-query/README.md index 27443c2026..27e7087592 100644 --- a/persistence-modules/spring-data-jpa-query/README.md +++ b/persistence-modules/spring-data-jpa-query/README.md @@ -5,7 +5,7 @@ This module contains articles about querying data using Spring Data JPA ### Relevant Articles: - [The Exists Query in Spring Data](https://www.baeldung.com/spring-data-exists-query) - [Customizing the Result of JPA Queries with Aggregation Functions](https://www.baeldung.com/jpa-queries-custom-result-with-aggregation-functions) -- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) +- [Limiting Query Results With JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) - [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting) - [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example) - [JPA Join Types](https://www.baeldung.com/jpa-join-types) From b87609265da2f584dddb8eddfb830650c635655a Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 11 Nov 2023 08:29:09 +0200 Subject: [PATCH 481/831] [JAVA-26709] Upgraded modelmapper to latest version --- .../pom.xml | 2 +- .../modelmapper/UsersListMappingUnitTest.java | 39 +++++++------------ libraries-6/pom.xml | 14 ++++--- parent-java/pom.xml | 2 +- performance-tests/pom.xml | 2 +- .../spring-boot-libraries/pom.xml | 2 +- spring-boot-rest/pom.xml | 2 +- 7 files changed, 28 insertions(+), 35 deletions(-) diff --git a/core-java-modules/core-java-collections-conversions-2/pom.xml b/core-java-modules/core-java-collections-conversions-2/pom.xml index 7b7533fc39..da6b6a564a 100644 --- a/core-java-modules/core-java-collections-conversions-2/pom.xml +++ b/core-java-modules/core-java-collections-conversions-2/pom.xml @@ -44,6 +44,6 @@ 0.10.3 11 - 3.1.1 + 3.2.0 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java index a8a72b12f7..c71f655044 100644 --- a/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java +++ b/core-java-modules/core-java-collections-conversions-2/src/test/java/com/baeldung/modelmapper/UsersListMappingUnitTest.java @@ -1,8 +1,9 @@ package com.baeldung.modelmapper; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.modelmapper.ModelMapper; import org.modelmapper.TypeMap; import org.modelmapper.TypeToken; @@ -10,11 +11,10 @@ import org.modelmapper.TypeToken; import java.util.ArrayList; import java.util.List; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasProperty; -import static org.junit.Assert.assertThat; - /** * This class has test methods of mapping Integer to Character list, @@ -22,12 +22,12 @@ import static org.junit.Assert.assertThat; * * @author Sasa Milenkovic */ -public class UsersListMappingUnitTest { +class UsersListMappingUnitTest { private ModelMapper modelMapper; private List users; - @Before + @BeforeEach public void init() { modelMapper = new ModelMapper(); @@ -35,18 +35,16 @@ public class UsersListMappingUnitTest { TypeMap typeMap = modelMapper.createTypeMap(UserList.class, UserListDTO.class); typeMap.addMappings(mapper -> mapper.using(new UsersListConverter()) - .map(UserList::getUsers, UserListDTO::setUsernames)); + .map(UserList::getUsers, UserListDTO::setUsernames)); - users = new ArrayList(); + users = new ArrayList<>(); users.add(new User("b100", "user1", "user1@baeldung.com", "111-222", "USER")); users.add(new User("b101", "user2", "user2@baeldung.com", "111-333", "USER")); users.add(new User("b102", "user3", "user3@baeldung.com", "111-444", "ADMIN")); - } @Test - public void whenInteger_thenMapToCharacter() { - + void whenInteger_thenMapToCharacter() { List integers = new ArrayList(); integers.add(1); @@ -57,36 +55,27 @@ public class UsersListMappingUnitTest { }.getType()); assertThat(characters, hasItems('1', '2', '3')); - } @Test - public void givenUsersList_whenUseGenericType_thenMapToUserDTO() { - + void givenUsersList_whenUseGenericType_thenMapToUserDTO() { // Mapping lists using custom (generic) type mapping - List userDtoList = MapperUtil.mapList(users, UserDTO.class); - assertThat(userDtoList, Matchers.hasItem( - Matchers.both(hasProperty("userId", equalTo("b100"))) - .and(hasProperty("email", equalTo("user1@baeldung.com"))) - .and(hasProperty("username", equalTo("user1"))))); - - + assertThat(userDtoList, Matchers. hasItem(Matchers.both(hasProperty("userId", equalTo("b100"))) + .and(hasProperty("email", equalTo("user1@baeldung.com"))) + .and(hasProperty("username", equalTo("user1"))))); } @Test - public void givenUsersList_whenUseConverter_thenMapToUsernames() { - + void givenUsersList_whenUseConverter_thenMapToUsernames() { // Mapping lists using property mapping and converter - UserList userList = new UserList(); userList.setUsers(users); UserListDTO dtos = new UserListDTO(); modelMapper.map(userList, dtos); assertThat(dtos.getUsernames(), hasItems("user1", "user2", "user3")); - } } \ No newline at end of file diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 139edab34f..9fa44d3a32 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -108,7 +108,7 @@ org.agrona agrona - 1.17.1 + ${agrona.version} @@ -126,7 +126,7 @@ org.codehaus.mojo exec-maven-plugin - 1.6.0 + ${exec-maven-plugin.version} generate-sources @@ -154,14 +154,14 @@ uk.co.real-logic sbe-tool - 1.27.0 + ${sbe-tool.version} org.codehaus.mojo build-helper-maven-plugin - 3.0.0 + ${build-helper-maven-plugin.version} add-source @@ -204,7 +204,11 @@ 3.0 1.8.1 8.12.9 - 2.4.4 + 3.2.0 + 1.17.1 + 1.6.0 + 1.27.0 + 3.0.0 \ No newline at end of file diff --git a/parent-java/pom.xml b/parent-java/pom.xml index b08925e040..03cafac55b 100644 --- a/parent-java/pom.xml +++ b/parent-java/pom.xml @@ -40,7 +40,7 @@ - 2.3.7 + 3.2.0 \ No newline at end of file diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 542a505b16..9f57a1a90c 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -152,7 +152,7 @@ 1.5.4 6.5.2 1.5.2.Final - 3.1.0 + 3.2.0 1.6.1.CR2 1.8 diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index b7b8ad17ad..ed9a414a60 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -219,7 +219,7 @@ 5.0.2 5.2.4 2.2.4 - 2.3.2 + 3.2.0 0.23.0 2.1.0 1.5-beta1 diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml index db646899ad..71916900a4 100644 --- a/spring-boot-rest/pom.xml +++ b/spring-boot-rest/pom.xml @@ -162,7 +162,7 @@ com.baeldung.SpringBootRestApplication 1.4.11.1 - 3.1.0 + 3.2.0 3.3.0 2.3.7 From 62b0d3def765c37d9082415d5411980dff8d3493 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 11 Nov 2023 12:17:46 +0530 Subject: [PATCH 482/831] JAVA-27185 Upgrade hibernate validator in spring-cloud-gateway-2 --- spring-cloud-modules/spring-cloud-gateway-2/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-gateway-2/pom.xml b/spring-cloud-modules/spring-cloud-gateway-2/pom.xml index 22182e8c78..4228c72d37 100644 --- a/spring-cloud-modules/spring-cloud-gateway-2/pom.xml +++ b/spring-cloud-modules/spring-cloud-gateway-2/pom.xml @@ -57,7 +57,7 @@ test - org.hibernate + org.hibernate.validator hibernate-validator-cdi ${hibernate-validator.version} @@ -116,7 +116,7 @@ - 6.0.2.Final + 8.0.1.Final 0.7.2 9.19 From df9e040b765b8ac8e59e911d8ef170b1b8269682 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 11 Nov 2023 12:59:42 +0530 Subject: [PATCH 483/831] JAVA-27186 Upgrade hibernate validator version in spring-cloud-gateway --- spring-cloud-modules/spring-cloud-gateway/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-gateway/pom.xml b/spring-cloud-modules/spring-cloud-gateway/pom.xml index 76072a59ac..0287ab7588 100644 --- a/spring-cloud-modules/spring-cloud-gateway/pom.xml +++ b/spring-cloud-modules/spring-cloud-gateway/pom.xml @@ -62,7 +62,7 @@ test - org.hibernate + org.hibernate.validator hibernate-validator-cdi ${hibernate-validator.version} @@ -185,7 +185,7 @@ - 6.0.2.Final + 8.0.1.Final 0.7.2 9.19 From 3435cd06509844c366a0d06a811bb967fc52ab2e Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 11 Nov 2023 13:43:35 +0530 Subject: [PATCH 484/831] JAVA-27187 Upgrade hibernate validator version in spring-core-2 --- spring-core-2/pom.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 2d11cc2124..f27b16acc3 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -88,9 +88,8 @@ - org.hibernate + org.hibernate.validator hibernate-validator - ${hibernate.version} @@ -160,8 +159,6 @@ com.baeldung.sample.App 1.3.2 - - 5.2.5.Final 3.6 2.1.0 From 3d5b1cff86e129f3cd33b934967d30e0b5cefc53 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 11 Nov 2023 14:11:32 +0530 Subject: [PATCH 485/831] JAVA-27188 Upgrade hibernate-validator version in spring-exceptions --- spring-exceptions/pom.xml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index 49c44f88f2..e0071a4206 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -72,7 +72,7 @@ - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -108,11 +108,6 @@ ${org.springframework.version} test - - javax.el - el-api - ${javax.el.version} - org.apache.derby derby @@ -171,8 +166,7 @@ 7.0.73 10.13.1.1 - 5.3.3.Final - 2.2 + 8.0.1.Final 2.3.0 4.4.5 From 8fff0f323cb8b949b31ef47177c1e1035d4a03bc Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 11 Nov 2023 10:53:34 +0000 Subject: [PATCH 486/831] [JAVA-20077] Sorted modules in alphabetical order (#15168) * [JAVA-20077] Sorted modules in alphabetical order * [JAVA-2007] --- pom.xml | 680 ++++++++++++++++++++++++++------------------------------ 1 file changed, 310 insertions(+), 370 deletions(-) diff --git a/pom.xml b/pom.xml index bb5a0c9e7b..47c566023d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,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 com.baeldung parent-modules @@ -690,35 +690,157 @@ - parent-boot-3 - lombok-modules - osgi - spring-katharsis - logging-modules - spring-boot-modules - apache-httpclient - apache-httpclient4 + akka-modules + algorithms-modules + antlr + apache-cxf-modules apache-httpclient-2 - spring-mobile - microservices-modules - spring-ejb-modules - spring-di - spring-di-2 - spring-jinq - vavr-modules - java-websocket + apache-httpclient4 + apache-httpclient + apache-kafka-2 + apache-kafka + apache-libraries-2 + apache-libraries + apache-olingo + apache-poi-2 + apache-poi-3 + apache-poi + apache-thrift + apache-tika + apache-velocity + asciidoctor + asm + atomikos + atomix + aws-modules azure - netflix-modules - spf4j - spring-jersey - jersey - jaxb - + bazel + checker-framework + core-groovy-modules + core-java-modules + custom-pmd + data-structures + deeplearning4j + di-modules + disruptor + docker-modules + dozer + drools + dubbo + + gcp-firebase + geotools + google-auto-project + google-cloud + gradle-modules/gradle/maven-to-gradle + graphql-modules + grpc + guava-modules + hazelcast + httpclient-simple + hystrix + image-compressing + image-processing + jackson-modules + jackson-simple + java-blockchain + java-jdi + + java-rmi + java-spi + java-websocket javafx - spring-batch + javax-sound + javaxval-2 + javaxval + jaxb + jersey + jetbrains + jgit + jhipster-6 + jib + jmeter + jmh + jsf + json-modules + jsoup + jws + ksqldb + kubernetes-modules + language-interop + libraries-2 + libraries-3 + libraries-4 + libraries-5 + libraries-6 + libraries-ai + libraries-apache-commons-2 + libraries-apache-commons-collections + libraries-apache-commons-io + libraries-apache-commons + libraries-concurrency + libraries-data-2 + libraries-data-db + libraries-data-io + libraries-data + libraries-files + libraries-http-2 + libraries-http + libraries-io + libraries-llms + libraries-primitive + libraries-rpc + libraries-security + libraries-server-2 + libraries-server + libraries-testing + libraries-transform + libraries + lightrun + logging-modules + lombok-modules + lucene + mapstruct + maven-modules + mesos-marathon + messaging-modules + metrics + microservices-modules + mustache + mybatis + netflix-modules + optaplanner + orika + osgi + parent-boot-3 + patterns-modules + pdf-2 + pdf + performance-tests + persistence-modules + persistence-modules/spring-data-neo4j + protobuffer + quarkus-modules + reactive-systems + reactor-core + rsocket + rule-engines-modules + rxjava-modules + saas-modules + security-modules + server-modules + spf4j + spring-5-webflux-2 + spring-5-webflux + spring-5 + spring-activiti + spring-actuator + spring-aop-2 + spring-aop spring-batch-2 + spring-batch + spring-boot-modules spring-boot-rest - spring-drools spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker spring-cloud-modules/spring-cloud-contract @@ -728,210 +850,58 @@ spring-cloud-modules/spring-cloud-security spring-cloud-modules/spring-cloud-stream-starters spring-cloud-modules/spring-cloud-zuul-eureka-integration - - spring-exceptions - spring-jenkins-pipeline - spring-core - spring-core-4 - spring-integration - spring-remoting-modules - libraries-security - libraries-data-db - - performance-tests - security-modules - libraries-server-2 - orika - patterns-modules - json-modules - libraries-data - saas-modules - server-modules - apache-cxf-modules - - spring-aop - jmeter - spring-aop-2 - - algorithms-modules - apache-libraries - apache-libraries-2 - apache-poi - apache-velocity - di-modules - asciidoctor - aws-modules - - checker-framework - core-groovy-modules - - core-java-modules - custom-pmd - data-structures - jackson-modules - jmh - deeplearning4j - docker-modules - drools - guava-modules - kubernetes-modules - libraries-concurrency - jhipster-6 - libraries-testing - maven-modules - optaplanner - persistence-modules - quarkus-modules - spring-reactive-modules - spring-swagger-codegen/custom-validations-opeanpi-codegen - testing-modules - testing-modules/mockito-simple - - rule-engines-modules - - reactive-systems - rxjava-modules - - lightrun - tablesaw - image-compressing - geotools - - jws - - - - akka-modules - httpclient-simple - antlr - apache-kafka - apache-kafka-2 - apache-olingo - - apache-poi-2 - apache-poi-3 - apache-thrift - apache-tika - - asm - atomikos - atomix - - bazel - google-auto-project - disruptor - dozer - dubbo - - google-cloud - graphql-modules - grpc - hazelcast - hystrix - jackson-simple - java-blockchain - java-jdi - java-rmi - java-spi - javax-sound - javaxval - javaxval-2 - jetbrains - jgit - jib - - jsoup - ksqldb - jsf - - libraries - libraries-2 - libraries-4 - libraries-5 - libraries-6 - - libraries-apache-commons - libraries-apache-commons-2 - libraries-apache-commons-collections - libraries-apache-commons-io - libraries-data-2 - libraries-data-io - libraries-files - libraries-http - libraries-http-2 - libraries-io - libraries-ai - libraries-primitive - libraries-rpc - libraries-server - libraries-transform - - lucene - mapstruct - mesos-marathon - metrics - mustache - mybatis - pdf - pdf-2 - protobuffer - reactor-core - rsocket - - - spring-5 - spring-5-webflux - spring-5-webflux-2 - spring-6-rsocket - spring-activiti - spring-actuator spring-core-2 spring-core-3 + spring-core-4 + spring-core spring-credhub - spring-di-3 spring-cucumber - + spring-di-2 + spring-di-3 + spring-di-4 + spring-di + spring-drools + spring-ejb-modules + spring-exceptions + spring-integration + spring-jenkins-pipeline + spring-jersey + spring-jinq + spring-kafka-2 spring-kafka - + spring-katharsis + spring-mobile spring-native - spring-soap - spring-security-modules spring-protobuf + spring-pulsar spring-quartz - + spring-reactive-modules + spring-remoting-modules spring-scheduling - - spring-state-machine + spring-security-modules spring-shell + spring-soap spring-spel + spring-state-machine spring-static-resources + spring-swagger-codegen/custom-validations-opeanpi-codegen spring-threads spring-vault - spring-websockets spring-web-modules + spring-websockets static-analysis + tablesaw tensorflow-java - vertx-modules - xstream - webrtc - - messaging-modules - + testing-modules + testing-modules/mockito-simple vaadin - libraries-3 + vavr-modules + vertx-modules web-modules - xml + webrtc xml-2 - image-processing - language-interop - gradle-modules/gradle/maven-to-gradle - persistence-modules/spring-data-neo4j - gcp-firebase - spring-di-4 - spring-kafka-2 - - libraries-llms - spring-pulsar + xml + xstream @@ -965,248 +935,218 @@ - parent-boot-3 - lombok-modules - osgi - spring-katharsis - logging-modules - spring-boot-modules - apache-httpclient - apache-httpclient4 - apache-httpclient-2 - spring-mobile - microservices-modules - spring-ejb-modules - spring-di - spring-di-2 - spring-jinq - vavr-modules - java-websocket - azure - netflix-modules - spf4j - spring-jersey - jersey - jaxb - - javafx - spring-batch - spring-batch-2 - spring-boot-rest - spring-drools - spring-cloud-modules/spring-cloud-azure - spring-cloud-modules/spring-cloud-circuit-breaker - spring-cloud-modules/spring-cloud-eureka - spring-cloud-modules/spring-cloud-contract - spring-cloud-modules/spring-cloud-data-flow - spring-cloud-modules/spring-cloud-netflix-feign - spring-cloud-modules/spring-cloud-stream-starters - spring-cloud-modules/spring-cloud-security - spring-cloud-modules/spring-cloud-zuul-eureka-integration - - spring-exceptions - spring-jenkins-pipeline - spring-core - spring-core-4 - spring-integration - spring-remoting-modules - libraries-security - libraries-data-db - - performance-tests - security-modules - libraries-server-2 - orika - patterns-modules - json-modules - libraries-data - saas-modules - server-modules - apache-cxf-modules - - algorithms-modules - apache-libraries - apache-libraries-2 - apache-poi - apache-velocity - di-modules - asciidoctor - aws-modules - - checker-framework - - core-groovy-modules - - core-java-modules - gcp-firebase - spring-aop - spring-aop-2 - custom-pmd - data-structures - jackson-modules - jmh - deeplearning4j - jmeter - docker-modules - drools - guava-modules - kubernetes-modules - libraries-concurrency - jhipster-6 - libraries-testing - maven-modules - optaplanner - persistence-modules - quarkus-modules - spring-reactive-modules - spring-swagger-codegen/custom-validations-opeanpi-codegen - testing-modules - testing-modules/mockito-simple - - rule-engines-modules - - reactive-systems - rxjava-modules - - lightrun - tablesaw - image-compressing - geotools - - jws - - - akka-modules + algorithms-modules antlr - apache-kafka + apache-cxf-modules + apache-httpclient-2 + apache-httpclient4 + apache-httpclient apache-kafka-2 + apache-kafka + apache-libraries-2 + apache-libraries apache-olingo - apache-poi-2 apache-poi-3 + apache-poi apache-thrift apache-tika - + apache-velocity + asciidoctor asm atomikos atomix - + aws-modules + azure bazel - google-auto-project + checker-framework + core-groovy-modules + core-java-modules + custom-pmd + data-structures + deeplearning4j + di-modules disruptor + docker-modules dozer - + drools dubbo + gcp-firebase + geotools + google-auto-project google-cloud + gradle-modules/gradle/maven-to-gradle graphql-modules grpc + guava-modules hazelcast httpclient-simple hystrix + image-compressing + image-processing + jackson-modules jackson-simple java-blockchain java-jdi + java-rmi java-spi + java-websocket + javafx javax-sound - javaxval javaxval-2 + javaxval + jaxb + jersey jetbrains jgit + jhipster-6 jib - - jsoup + jmeter + jmh jsf + json-modules + jsoup + jws ksqldb - - libraries + kubernetes-modules + language-interop libraries-2 + libraries-3 libraries-4 libraries-5 libraries-6 - libraries-apache-commons + libraries-ai libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io + libraries-apache-commons + libraries-concurrency libraries-data-2 + libraries-data-db libraries-data-io + libraries-data libraries-files - libraries-http libraries-http-2 + libraries-http libraries-io - libraries-ai + libraries-llms libraries-primitive libraries-rpc + libraries-security + libraries-server-2 libraries-server + libraries-testing libraries-transform - + libraries + lightrun + logging-modules + lombok-modules lucene mapstruct + maven-modules mesos-marathon + messaging-modules metrics + microservices-modules mustache mybatis - pdf + netflix-modules + optaplanner + orika + osgi + parent-boot-3 + patterns-modules pdf-2 + pdf + performance-tests + persistence-modules + persistence-modules/spring-data-neo4j protobuffer + quarkus-modules + reactive-systems reactor-core rsocket - - - - spring-5 - spring-5-webflux + rule-engines-modules + rxjava-modules + saas-modules + security-modules + server-modules + spf4j spring-5-webflux-2 + spring-5-webflux + spring-5 spring-activiti + spring-actuator + spring-aop-2 + spring-aop + spring-batch-2 + spring-batch + spring-boot-modules + spring-boot-rest + spring-cloud-modules/spring-cloud-azure + spring-cloud-modules/spring-cloud-circuit-breaker + spring-cloud-modules/spring-cloud-contract + spring-cloud-modules/spring-cloud-data-flow + spring-cloud-modules/spring-cloud-eureka + spring-cloud-modules/spring-cloud-netflix-feign + spring-cloud-modules/spring-cloud-security + spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-core-2 spring-core-3 + spring-core-4 + spring-core spring-credhub - spring-di-3 spring-cucumber - + spring-di-2 + spring-di-3 + spring-di-4 + spring-di + spring-drools + spring-ejb-modules + spring-exceptions + spring-integration + spring-jenkins-pipeline + spring-jersey + spring-jinq + spring-kafka-2 spring-kafka - + spring-katharsis + spring-mobile spring-native - spring-soap - spring-security-modules spring-protobuf + spring-pulsar spring-quartz - + spring-reactive-modules + spring-remoting-modules spring-scheduling - - spring-state-machine + spring-security-modules spring-shell + spring-soap spring-spel + spring-state-machine spring-static-resources + spring-swagger-codegen/custom-validations-opeanpi-codegen spring-threads spring-vault - spring-websockets spring-web-modules + spring-websockets static-analysis + tablesaw tensorflow-java - vertx-modules - xstream - webrtc - - messaging-modules - + testing-modules + testing-modules/mockito-simple vaadin - libraries-3 + vavr-modules + vertx-modules web-modules - xml + webrtc xml-2 - image-processing - language-interop - gradle-modules/gradle/maven-to-gradle - persistence-modules/spring-data-neo4j - spring-actuator - spring-di-4 - spring-kafka-2 - - libraries-llms - spring-pulsar + xml + xstream From 3f850f7d00d6bb52046edb1b502062ae18c816cd Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sat, 11 Nov 2023 12:05:30 +0100 Subject: [PATCH 487/831] JAVA-26728 | update sshj lib (#15144) * JAVA-26728 | update sshj lib * JAVA-26728 | added compression --- libraries-io/pom.xml | 2 +- .../io/remote/SftpFileTransferLiveTest.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml index 08ad0afc3f..7464b9a507 100644 --- a/libraries-io/pom.xml +++ b/libraries-io/pom.xml @@ -56,7 +56,7 @@ 0.1.55 - 0.27.0 + 0.37.0 2.4 2.9.0 5.8 diff --git a/libraries-io/src/test/java/com/baeldung/java/io/remote/SftpFileTransferLiveTest.java b/libraries-io/src/test/java/com/baeldung/java/io/remote/SftpFileTransferLiveTest.java index 5846128082..81c6cb556c 100644 --- a/libraries-io/src/test/java/com/baeldung/java/io/remote/SftpFileTransferLiveTest.java +++ b/libraries-io/src/test/java/com/baeldung/java/io/remote/SftpFileTransferLiveTest.java @@ -20,14 +20,14 @@ import net.schmizz.sshj.transport.verification.PromiscuousVerifier; public class SftpFileTransferLiveTest { - private String remoteHost = "HOST_NAME_HERE"; - private String username = "USERNAME_HERE"; - private String password = "PASSWORD_HERE"; - private String localFile = "src/main/resources/input.txt"; - private String remoteFile = "welcome.txt"; - private String localDir = "src/main/resources/"; - private String remoteDir = "remote_sftp_test/"; - private String knownHostsFileLoc = "/Users/USERNAME/known_hosts_sample"; + private final String remoteHost = "HOST_NAME_HERE"; + private final String username = "USERNAME_HERE"; + private final String password = "PASSWORD_HERE"; + private final String localFile = "src/main/resources/input.txt"; + private final String remoteFile = "welcome.txt"; + private final String localDir = "src/main/resources/"; + private final String remoteDir = "remote_sftp_test/"; + private final String knownHostsFileLoc = "/Users/USERNAME/known_hosts_sample"; @Test public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException { @@ -100,6 +100,7 @@ public class SftpFileTransferLiveTest { client.addHostKeyVerifier(new PromiscuousVerifier()); client.connect(remoteHost); client.authPassword(username, password); + client.useCompression(); return client; } From c03477e2bd52385683bbb4d93ee1af3b731d4e02 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sat, 11 Nov 2023 19:14:58 +0000 Subject: [PATCH 488/831] rename returning first non empty optional test method --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java index 4686692215..f2ea8f74e3 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -19,7 +19,7 @@ public class ReturnFirstNonEmptyOptionalUnitTest { } @Test - void givenListOfOptionals_thenReturnFirstNonEmpty() { + void givenListOfOptionals_whenStreaming_thenReturnFirstNonEmpty() { Optional object = optionals.stream() .filter(Optional::isPresent) .map(Optional::get) From 2581618debfd1519af6dd37160d0d0942fcff927 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sat, 11 Nov 2023 19:17:28 +0000 Subject: [PATCH 489/831] indent fluent apis 2 spaces --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 6 +++--- .../ReturnFirstNonNullLazyEvaluateUnitTest.java | 6 +++--- .../returnfirstnonnull/ReturnFirstNonNullUnitTest.java | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java index f2ea8f74e3..b05e0e2d34 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -21,9 +21,9 @@ public class ReturnFirstNonEmptyOptionalUnitTest { @Test void givenListOfOptionals_whenStreaming_thenReturnFirstNonEmpty() { Optional object = optionals.stream() - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); assertThat(object).contains("first non empty"); } diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java index 649e5f4299..fff348052a 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -48,9 +48,9 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { @Test void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { Optional object = Stream.> of(spy::methodA, spy::methodB, spy::methodC) - .map(Supplier::get) - .filter(Objects::nonNull) - .findFirst(); + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst(); assertThat(object).contains("first non null"); verify(spy, times(1)).methodA(); diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java index aae775997d..e7bb4d399f 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -28,8 +28,8 @@ public class ReturnFirstNonNullUnitTest { @Test void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { Optional object = objects.stream() - .filter(o -> o != null) - .findFirst(); + .filter(o -> o != null) + .findFirst(); assertThat(object).contains("first non null"); } @@ -37,8 +37,8 @@ public class ReturnFirstNonNullUnitTest { @Test void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { Optional object = objects.stream() - .filter(Objects::nonNull) - .findFirst(); + .filter(Objects::nonNull) + .findFirst(); assertThat(object).contains("first non null"); } From b31e6984ad8800bb9590b4ab06d2fd0857988d3c Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sat, 11 Nov 2023 19:22:20 +0000 Subject: [PATCH 490/831] rename test methods --- .../ReturnFirstNonNullLazyEvaluateUnitTest.java | 2 +- .../returnfirstnonnull/ReturnFirstNonNullUnitTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java index fff348052a..56c846eb0e 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -19,7 +19,7 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { private final LazyEvaluate spy = Mockito.spy(new LazyEvaluate()); @Test - void givenChainOfMethods_thenLazilyEvaluateMethodsUntilFirstNonNull() { + void givenChainOfMethods_whenUsingIfStatements_thenLazilyEvaluateMethodsUntilFirstNonNull() { String object = spy.methodA(); if (object == null) { object = spy.methodB(); diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java index e7bb4d399f..32c95f0e84 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -26,7 +26,7 @@ public class ReturnFirstNonNullUnitTest { } @Test - void givenListOfObjects_whenFilterIsLambdaNullCheck_thenReturnFirstNonNull() { + void givenListOfObjects_whenFilterIsLambdaNullCheckInStream_thenReturnFirstNonNull() { Optional object = objects.stream() .filter(o -> o != null) .findFirst(); @@ -35,7 +35,7 @@ public class ReturnFirstNonNullUnitTest { } @Test - void givenListOfObjects_whenFilterIsMethodRefNullCheck_thenReturnFirstNonNull() { + void givenListOfObjects_whenFilterIsMethodRefNullCheckInStream_thenReturnFirstNonNull() { Optional object = objects.stream() .filter(Objects::nonNull) .findFirst(); From 47f7b926e60709efe74245b33a37a3cb0c2f7db0 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 07:32:39 +0200 Subject: [PATCH 491/831] [JAVA-26774] Upgraded mapstruct library to latest version --- core-java-modules/core-java-lang-6/pom.xml | 3 +-- jhipster-6/bookstore-monolith/pom.xml | 2 +- jhipster-modules/jhipster-microservice/car-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/dealer-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/gateway-app/pom.xml | 2 +- jhipster-modules/jhipster-monolithic/pom.xml | 2 +- jhipster-modules/jhipster-uaa/gateway/pom.xml | 2 +- jhipster-modules/jhipster-uaa/quotes/pom.xml | 2 +- jhipster-modules/jhipster-uaa/uaa/pom.xml | 2 +- mapstruct/pom.xml | 2 +- performance-tests/pom.xml | 2 +- persistence-modules/spring-data-jpa-enterprise/pom.xml | 4 ++-- spring-boot-modules/spring-boot-3-2/pom.xml | 2 +- spring-boot-modules/spring-boot-3/pom.xml | 4 ++-- 14 files changed, 16 insertions(+), 17 deletions(-) diff --git a/core-java-modules/core-java-lang-6/pom.xml b/core-java-modules/core-java-lang-6/pom.xml index 6561c4fdcc..54035c1eb0 100644 --- a/core-java-modules/core-java-lang-6/pom.xml +++ b/core-java-modules/core-java-lang-6/pom.xml @@ -29,7 +29,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 17 17 @@ -50,7 +49,7 @@ 17 17 UTF-8 - 1.5.5.Final + 1.6.0.Beta1 \ No newline at end of file diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index a35abb9c19..26a1ff6214 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -1159,7 +1159,7 @@ 5.1.5.RELEASE 2.0.1.Final 2.3.2 - 1.3.0.Final + 1.6.0.Beta1 3.1.0 diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index f345688939..3789dc35c1 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -36,7 +36,7 @@ 3.6.2 4.8 jdt_apt - 1.1.0.Final + 1.6.0.Beta1 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index 056bd60f33..5d588e8dcb 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -35,7 +35,7 @@ 3.6.2 4.8 jdt_apt - 1.1.0.Final + 1.6.0.Beta1 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index b90f22f009..26c621bb57 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -39,7 +39,7 @@ 4.8 1.3.0 jdt_apt - 1.1.0.Final + 1.6.0.Beta1 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index fbcee8f1ff..a8b93b5514 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -904,7 +904,7 @@ 3.6.2 4.8 jdt_apt - 1.1.0.Final + 1.6.0.Beta1 1.4.1 3.0.1 2.10 diff --git a/jhipster-modules/jhipster-uaa/gateway/pom.xml b/jhipster-modules/jhipster-uaa/gateway/pom.xml index 13652575cd..b1982a6f93 100644 --- a/jhipster-modules/jhipster-uaa/gateway/pom.xml +++ b/jhipster-modules/jhipster-uaa/gateway/pom.xml @@ -1048,7 +1048,7 @@ 3.5.5 3.6 2.0.1.Final - 1.2.0.Final + 1.6.0.Beta1 3.1.0 diff --git a/jhipster-modules/jhipster-uaa/quotes/pom.xml b/jhipster-modules/jhipster-uaa/quotes/pom.xml index 2a3c550071..11033af395 100644 --- a/jhipster-modules/jhipster-uaa/quotes/pom.xml +++ b/jhipster-modules/jhipster-uaa/quotes/pom.xml @@ -868,7 +868,7 @@ 3.5.5 3.6 2.0.1.Final - 1.2.0.Final + 1.6.0.Beta1 3.1.0 diff --git a/jhipster-modules/jhipster-uaa/uaa/pom.xml b/jhipster-modules/jhipster-uaa/uaa/pom.xml index 42802b6040..47a5c81c1e 100644 --- a/jhipster-modules/jhipster-uaa/uaa/pom.xml +++ b/jhipster-modules/jhipster-uaa/uaa/pom.xml @@ -869,7 +869,7 @@ 3.5.5 3.6 2.0.1.Final - 1.2.0.Final + 1.6.0.Beta1 3.1.0 diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 7c279acb7b..5332bcaeb3 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -73,7 +73,7 @@ - 1.5.5.Final + 1.6.0.Beta1 4.3.4.RELEASE 0.2.0 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 9f57a1a90c..d22a9cf3ac 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -151,7 +151,7 @@ 1.5.4 6.5.2 - 1.5.2.Final + 1.6.0.Beta1 3.2.0 1.6.1.CR2 diff --git a/persistence-modules/spring-data-jpa-enterprise/pom.xml b/persistence-modules/spring-data-jpa-enterprise/pom.xml index 6bd89032fa..d998849ffb 100644 --- a/persistence-modules/spring-data-jpa-enterprise/pom.xml +++ b/persistence-modules/spring-data-jpa-enterprise/pom.xml @@ -45,7 +45,7 @@ org.mapstruct - mapstruct-jdk8 + mapstruct ${mapstruct.version} provided @@ -97,7 +97,7 @@ - 1.3.1.Final + 1.6.0.Beta1 1.19.1 diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index 276659c609..9b5b7ea254 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -280,7 +280,7 @@ - 1.5.2.Final + 1.6.0.Beta1 2.0.0 3.0.0-M7 5.14.0 diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index bb8c5dd53c..a1a5eab563 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -206,8 +206,8 @@ - 19 - 1.5.2.Final + 17 + 1.6.0.Beta1 2.2.0 3.0.0-M7 com.baeldung.sample.TodoApplication From 6db881bfa2df6776a67b7de0873c07bed1402aed Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 07:53:55 +0200 Subject: [PATCH 492/831] [JAVA-26774] Revert mapstruct upgrade on jhipster modules --- jhipster-6/bookstore-monolith/pom.xml | 2 +- jhipster-modules/jhipster-microservice/car-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/dealer-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/gateway-app/pom.xml | 2 +- jhipster-modules/jhipster-monolithic/pom.xml | 2 +- jhipster-modules/jhipster-uaa/gateway/pom.xml | 2 +- jhipster-modules/jhipster-uaa/quotes/pom.xml | 2 +- jhipster-modules/jhipster-uaa/uaa/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index 26a1ff6214..a35abb9c19 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -1159,7 +1159,7 @@ 5.1.5.RELEASE 2.0.1.Final 2.3.2 - 1.6.0.Beta1 + 1.3.0.Final 3.1.0 diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index 3789dc35c1..f345688939 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -36,7 +36,7 @@ 3.6.2 4.8 jdt_apt - 1.6.0.Beta1 + 1.1.0.Final 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index 5d588e8dcb..056bd60f33 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -35,7 +35,7 @@ 3.6.2 4.8 jdt_apt - 1.6.0.Beta1 + 1.1.0.Final 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index 26c621bb57..b90f22f009 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -39,7 +39,7 @@ 4.8 1.3.0 jdt_apt - 1.6.0.Beta1 + 1.1.0.Final 2.10 1.4.1 3.0.1 diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index a8b93b5514..fbcee8f1ff 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -904,7 +904,7 @@ 3.6.2 4.8 jdt_apt - 1.6.0.Beta1 + 1.1.0.Final 1.4.1 3.0.1 2.10 diff --git a/jhipster-modules/jhipster-uaa/gateway/pom.xml b/jhipster-modules/jhipster-uaa/gateway/pom.xml index b1982a6f93..13652575cd 100644 --- a/jhipster-modules/jhipster-uaa/gateway/pom.xml +++ b/jhipster-modules/jhipster-uaa/gateway/pom.xml @@ -1048,7 +1048,7 @@ 3.5.5 3.6 2.0.1.Final - 1.6.0.Beta1 + 1.2.0.Final 3.1.0 diff --git a/jhipster-modules/jhipster-uaa/quotes/pom.xml b/jhipster-modules/jhipster-uaa/quotes/pom.xml index 11033af395..2a3c550071 100644 --- a/jhipster-modules/jhipster-uaa/quotes/pom.xml +++ b/jhipster-modules/jhipster-uaa/quotes/pom.xml @@ -868,7 +868,7 @@ 3.5.5 3.6 2.0.1.Final - 1.6.0.Beta1 + 1.2.0.Final 3.1.0 diff --git a/jhipster-modules/jhipster-uaa/uaa/pom.xml b/jhipster-modules/jhipster-uaa/uaa/pom.xml index 47a5c81c1e..42802b6040 100644 --- a/jhipster-modules/jhipster-uaa/uaa/pom.xml +++ b/jhipster-modules/jhipster-uaa/uaa/pom.xml @@ -869,7 +869,7 @@ 3.5.5 3.6 2.0.1.Final - 1.6.0.Beta1 + 1.2.0.Final 3.1.0 From 7dbd9cf9f60aa62ce088a7196d606f6c2e4c870c Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 08:00:42 +0200 Subject: [PATCH 493/831] [JAVA-26774] --- spring-boot-modules/spring-boot-3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index a1a5eab563..ae9e9d7308 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -206,7 +206,7 @@ - 17 + 19 1.6.0.Beta1 2.2.0 3.0.0-M7 From 46dbc56913f2b3dc7f90b1d12e540a20edcb3ebf Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 12 Nov 2023 11:51:29 +0530 Subject: [PATCH 494/831] JAVA-27189 Upgrade hibernate validator version in spring-static-resources --- spring-static-resources/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-static-resources/pom.xml b/spring-static-resources/pom.xml index f682eafdbe..f635583e62 100644 --- a/spring-static-resources/pom.xml +++ b/spring-static-resources/pom.xml @@ -117,7 +117,7 @@ ${jackson.version} - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -194,7 +194,7 @@ 1.8.9 - 6.0.10.Final + 8.0.1.Final 4.1.0 2.10 1 From c5cbb3f0d98d88531bda791ee49463c4411129f0 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 08:52:18 +0200 Subject: [PATCH 495/831] [JAVA-26763] Upgraded powermock to latest version --- spring-web-modules/spring-mvc-velocity/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-mvc-velocity/pom.xml b/spring-web-modules/spring-mvc-velocity/pom.xml index 676fa09dac..cc92e8c6a5 100644 --- a/spring-web-modules/spring-mvc-velocity/pom.xml +++ b/spring-web-modules/spring-mvc-velocity/pom.xml @@ -64,7 +64,7 @@ org.powermock - powermock-api-mockito + powermock-api-mockito2 ${powermock.version} test @@ -106,7 +106,7 @@ - 1.6.6 + 2.0.9 4.4.5 4.5.2 1.7 From 21f73644b4b55c9508d588f0613690390ed404e7 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 12 Nov 2023 13:24:22 +0530 Subject: [PATCH 496/831] JAVA-27191 Upgrade hibernate validator version in spring-mvc-basics-2 --- spring-web-modules/spring-mvc-basics-2/pom.xml | 4 ++-- .../com/baeldung/spring/controller/CustomerController.java | 2 +- .../com/baeldung/spring/controller/EmployeeController.java | 2 +- .../java/com/baeldung/spring/controller/MailController.java | 2 +- .../src/main/java/com/baeldung/spring/domain/Employee.java | 4 ++-- .../main/java/com/baeldung/spring/domain/MailObject.java | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/spring-web-modules/spring-mvc-basics-2/pom.xml b/spring-web-modules/spring-mvc-basics-2/pom.xml index 28eb3a16f2..613e42dee3 100644 --- a/spring-web-modules/spring-mvc-basics-2/pom.xml +++ b/spring-web-modules/spring-mvc-basics-2/pom.xml @@ -42,7 +42,7 @@ ${jstl.version} - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -148,7 +148,7 @@ - 6.0.10.Final + 8.0.1.Final enter-location-of-server 3.0.11.RELEASE 2.4.12 diff --git a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/CustomerController.java b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/CustomerController.java index 8ecfce58e3..e1d2a8e37f 100644 --- a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/CustomerController.java +++ b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/CustomerController.java @@ -1,6 +1,6 @@ package com.baeldung.spring.controller; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/EmployeeController.java b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/EmployeeController.java index 6543a98af1..5299d8289b 100644 --- a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/EmployeeController.java +++ b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/EmployeeController.java @@ -3,7 +3,7 @@ package com.baeldung.spring.controller; import java.util.HashMap; import java.util.Map; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; diff --git a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java index b6e19a4c39..f4088b8bb3 100644 --- a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java +++ b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/controller/MailController.java @@ -8,7 +8,7 @@ import java.util.Set; import javax.mail.MessagingException; import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; diff --git a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/Employee.java b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/Employee.java index 900770b873..a0641b0a32 100644 --- a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/Employee.java +++ b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/Employee.java @@ -1,7 +1,7 @@ package com.baeldung.spring.domain; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public class Employee { diff --git a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java index d425ca9a26..23807926ca 100644 --- a/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java +++ b/spring-web-modules/spring-mvc-basics-2/src/main/java/com/baeldung/spring/domain/MailObject.java @@ -1,8 +1,8 @@ package com.baeldung.spring.domain; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; /** * Created by Olga on 7/20/2016. From 57b035bade3b2481ec793d1ca7bd85f012f86dee Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 12 Nov 2023 14:01:38 +0530 Subject: [PATCH 497/831] JAVA-27192 Upgrade hibernate validator in spring-mvc-crash --- spring-web-modules/spring-mvc-crash/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-mvc-crash/pom.xml b/spring-web-modules/spring-mvc-crash/pom.xml index f3faa18816..9bfcfb488e 100644 --- a/spring-web-modules/spring-mvc-crash/pom.xml +++ b/spring-web-modules/spring-mvc-crash/pom.xml @@ -147,7 +147,7 @@ 4.4.5 4.5.2 - 6.0.10.Final + 8.0.1.Final 3.0.1-b08 2.8.0 From e6316d25d3f8be6060ea15aae0fc2c7196240db0 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 12 Nov 2023 14:30:03 +0530 Subject: [PATCH 498/831] JAVA-27193 Upgrade hibernate validator version in spring-mvc-forms-jsp --- spring-web-modules/spring-mvc-forms-jsp/pom.xml | 4 ++-- .../controller/CustomerController.java | 2 +- .../controller/EmployeeController.java | 2 +- .../springmvcforms/controller/UserController.java | 2 +- .../com/baeldung/springmvcforms/domain/Employee.java | 4 ++-- .../com/baeldung/springmvcforms/domain/User.java | 12 ++++++------ 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/spring-web-modules/spring-mvc-forms-jsp/pom.xml b/spring-web-modules/spring-mvc-forms-jsp/pom.xml index 3ad815e95f..5096c6e23d 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/pom.xml +++ b/spring-web-modules/spring-mvc-forms-jsp/pom.xml @@ -48,7 +48,7 @@ ${mysql-connector-java.version} - org.hibernate + org.hibernate.validator hibernate-validator ${hibernate-validator.version} @@ -102,7 +102,7 @@ - 6.0.10.Final + 8.0.1.Final 5.2.5.Final 6.0.6 1.3.2 diff --git a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java index 586c2467fe..81dd700551 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java +++ b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java @@ -1,6 +1,6 @@ package com.baeldung.springmvcforms.controller; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java index 478b3532fe..9c0b3a7086 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java +++ b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java @@ -7,7 +7,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.HashMap; import java.util.Map; diff --git a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java index f5553cf2b7..80f56645a9 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java +++ b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java index 23cb72b3dc..ae174e2020 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java +++ b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java @@ -1,7 +1,7 @@ package com.baeldung.springmvcforms.domain; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public class Employee { diff --git a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java index 9e0e7c99be..db055763a4 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java +++ b/spring-web-modules/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java @@ -1,11 +1,11 @@ package com.baeldung.springmvcforms.domain; -import javax.validation.constraints.Digits; -import javax.validation.constraints.Email; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; public class User { From ec251f847b550c513d6431ea34de0599e298c239 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 16:35:46 +0200 Subject: [PATCH 499/831] [JAVA-26739] Upgraded json-path to latest version --- core-java-modules/core-java-optional/pom.xml | 4 +- .../java9additions/Java9OptionalUnitTest.java | 170 +++++++++--------- ethereum/pom.xml | 2 +- jackson-modules/jackson-annotations/pom.xml | 4 +- json-modules/json-path/pom.xml | 4 +- .../spring-mvc-basics-5/pom.xml | 2 +- spring-web-modules/spring-mvc-java/pom.xml | 2 +- video-tutorials/jackson-annotations/pom.xml | 2 +- 8 files changed, 94 insertions(+), 96 deletions(-) diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml index eeefed867e..68800f67fc 100644 --- a/core-java-modules/core-java-optional/pom.xml +++ b/core-java-modules/core-java-optional/pom.xml @@ -47,14 +47,14 @@ io.rest-assured json-path - ${rest-assured.version} + ${json-path.version} test 5.4.0.Final - 3.1.1 + 5.3.2 \ No newline at end of file diff --git a/core-java-modules/core-java-optional/src/test/java/com/baeldung/java9additions/Java9OptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java9additions/Java9OptionalUnitTest.java index ee04432e44..e7daac4b8c 100644 --- a/core-java-modules/core-java-optional/src/test/java/com/baeldung/java9additions/Java9OptionalUnitTest.java +++ b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java9additions/Java9OptionalUnitTest.java @@ -8,88 +8,88 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -// Uncomment code when code base is compatible with Java 9 -//public class Java9OptionalUnitTest { -// -// @Test -// public void givenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream() { -// //given -// Optional value = Optional.of("a"); -// -// //when -// List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); -// -// //then -// assertThat(collect).hasSameElementsAs(List.of("A")); -// } -// -// @Test -// public void givenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream() { -// //given -// Optional value = Optional.empty(); -// -// //when -// List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); -// -// //then -// assertThat(collect).isEmpty(); -// } -// -// @Test -// public void givenOptional_whenPresent_thenShouldExecuteProperCallback() { -// //given -// Optional value = Optional.of("properValue"); -// AtomicInteger successCounter = new AtomicInteger(0); -// AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); -// -// //when -// value.ifPresentOrElse((v) -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); -// -// //then -// assertThat(successCounter.get()).isEqualTo(1); -// assertThat(onEmptyOptionalCounter.get()).isEqualTo(0); -// } -// -// @Test -// public void givenOptional_whenNotPresent_thenShouldExecuteProperCallback() { -// //given -// Optional value = Optional.empty(); -// AtomicInteger successCounter = new AtomicInteger(0); -// AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); -// -// //when -// value.ifPresentOrElse((v) -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); -// -// //then -// assertThat(successCounter.get()).isEqualTo(0); -// assertThat(onEmptyOptionalCounter.get()).isEqualTo(1); -// } -// -// @Test -// public void givenOptional_whenPresent_thenShouldTakeAValueFromIt() { -// //given -// String expected = "properValue"; -// Optional value = Optional.of(expected); -// Optional defaultValue = Optional.of("default"); -// -// //when -// Optional result = value.or(() -> defaultValue); -// -// //then -// assertThat(result.get()).isEqualTo(expected); -// } -// -// @Test -// public void givenOptional_whenEmpty_thenShouldTakeAValueFromOr() { -// //given -// String defaultString = "default"; -// Optional value = Optional.empty(); -// Optional defaultValue = Optional.of(defaultString); -// -// //when -// Optional result = value.or(() -> defaultValue); -// -// //then -// assertThat(result.get()).isEqualTo(defaultString); -// } -//} \ No newline at end of file + +public class Java9OptionalUnitTest { + + @Test + public void givenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream() { + //given + Optional value = Optional.of("a"); + + //when + List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); + + //then + assertThat(collect).hasSameElementsAs(List.of("A")); + } + + @Test + public void givenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream() { + //given + Optional value = Optional.empty(); + + //when + List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); + + //then + assertThat(collect).isEmpty(); + } + + @Test + public void givenOptional_whenPresent_thenShouldExecuteProperCallback() { + //given + Optional value = Optional.of("properValue"); + AtomicInteger successCounter = new AtomicInteger(0); + AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); + + //when + value.ifPresentOrElse((v) -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); + + //then + assertThat(successCounter.get()).isEqualTo(1); + assertThat(onEmptyOptionalCounter.get()).isEqualTo(0); + } + + @Test + public void givenOptional_whenNotPresent_thenShouldExecuteProperCallback() { + //given + Optional value = Optional.empty(); + AtomicInteger successCounter = new AtomicInteger(0); + AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); + + //when + value.ifPresentOrElse((v) -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); + + //then + assertThat(successCounter.get()).isEqualTo(0); + assertThat(onEmptyOptionalCounter.get()).isEqualTo(1); + } + + @Test + public void givenOptional_whenPresent_thenShouldTakeAValueFromIt() { + //given + String expected = "properValue"; + Optional value = Optional.of(expected); + Optional defaultValue = Optional.of("default"); + + //when + Optional result = value.or(() -> defaultValue); + + //then + assertThat(result.get()).isEqualTo(expected); + } + + @Test + public void givenOptional_whenEmpty_thenShouldTakeAValueFromOr() { + //given + String defaultString = "default"; + Optional value = Optional.empty(); + Optional defaultValue = Optional.of(defaultString); + + //when + Optional result = value.or(() -> defaultValue); + + //then + assertThat(result.get()).isEqualTo(defaultString); + } +} \ No newline at end of file diff --git a/ethereum/pom.xml b/ethereum/pom.xml index 8dc25427d9..a94f74c115 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -192,7 +192,7 @@ 1.5.0-RELEASE 3.3.1 1.5.6.RELEASE - 2.4.0 + 2.8.0 2.0.4.RELEASE 3.1 diff --git a/jackson-modules/jackson-annotations/pom.xml b/jackson-modules/jackson-annotations/pom.xml index e2d5e1e607..59d7d3d197 100644 --- a/jackson-modules/jackson-annotations/pom.xml +++ b/jackson-modules/jackson-annotations/pom.xml @@ -21,7 +21,7 @@ io.rest-assured json-path - ${rest-assured.version} + ${json-path.version} test @@ -59,7 +59,7 @@ 2.1.214 - 3.1.1 + 5.3.2 2.5.0 diff --git a/json-modules/json-path/pom.xml b/json-modules/json-path/pom.xml index 88b81dfc68..763a275290 100644 --- a/json-modules/json-path/pom.xml +++ b/json-modules/json-path/pom.xml @@ -13,7 +13,6 @@ - com.jayway.jsonpath json-path @@ -22,8 +21,7 @@ - - 2.4.0 + 2.8.0 \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-basics-5/pom.xml b/spring-web-modules/spring-mvc-basics-5/pom.xml index e0d603e303..1c8c87a2ef 100644 --- a/spring-web-modules/spring-mvc-basics-5/pom.xml +++ b/spring-web-modules/spring-mvc-basics-5/pom.xml @@ -82,7 +82,7 @@ 1.3.2 - 2.7.0 + 2.8.0 2.3.5 2.0.0 3.0.0 diff --git a/spring-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml index 8098f07282..717c3b76b8 100644 --- a/spring-web-modules/spring-mvc-java/pom.xml +++ b/spring-web-modules/spring-mvc-java/pom.xml @@ -237,7 +237,7 @@ 4.0.1 2.3.3 2.32 - 2.4.0 + 2.8.0 com.baeldung.SpringMVCApplication diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index eaec50c1f7..f6a2e6928a 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -120,7 +120,7 @@ 3.0.1 3.0.0 2.2.6 - 3.0.1 + 5.3.2 \ No newline at end of file From fc91dd633712953b632249dda9d78f1ef9a75c3c Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 12 Nov 2023 16:01:21 +0100 Subject: [PATCH 500/831] JAVA-27462 | removing spring security deprecations. --- .../src/main/java/com/baeldung/keycloak/SecurityConfig.java | 4 +++- .../com/baeldung/keycloaksoap/KeycloakSecurityConfig.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java index eb7767480f..5b9ce9677a 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -53,7 +54,8 @@ class SecurityConfig { .hasRole("USER") .anyRequest() .authenticated(); - http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); + http.oauth2ResourceServer((oauth2) -> oauth2 + .jwt(Customizer.withDefaults())); return http.build(); } diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java index e55d307e33..70b306eaee 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java @@ -3,6 +3,7 @@ package com.baeldung.keycloaksoap; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -21,7 +22,8 @@ public class KeycloakSecurityConfig { .disable() .authorizeHttpRequests(auth -> auth.anyRequest() .authenticated()) - .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); + .oauth2ResourceServer((oauth2) -> oauth2 + .jwt(Customizer.withDefaults())); return http.build(); } } From b0a0d8c2475932c6eab0d46ae20294ccfe956e3d Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 12 Nov 2023 16:13:39 +0100 Subject: [PATCH 501/831] JAVA-27461 | removing spring security deprecations. --- .../com/baeldung/keycloaksoap/KeycloakSecurityConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java index 70b306eaee..77ffc6a5b4 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java @@ -7,6 +7,7 @@ import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; import org.springframework.security.web.SecurityFilterChain; @@ -18,8 +19,7 @@ public class KeycloakSecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.csrf() - .disable() + http.csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth.anyRequest() .authenticated()) .oauth2ResourceServer((oauth2) -> oauth2 From aed73f72f5458591646d6bc48747c037ab1f43d9 Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 12 Nov 2023 16:13:53 +0100 Subject: [PATCH 502/831] JAVA-27461 | removing spring security deprecations. --- .../java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java index 77ffc6a5b4..ff1cf0cb42 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloaksoap/KeycloakSecurityConfig.java @@ -8,7 +8,6 @@ import org.springframework.security.config.annotation.method.configuration.Enabl import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; import org.springframework.security.web.SecurityFilterChain; @Configuration From e6cb1a2e43c3c84dbfc1799dda2bb0052f47b2aa Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 17:34:55 +0200 Subject: [PATCH 503/831] [JAVA-26714] Upgraded commons-codec to latest version --- algorithms-modules/pom.xml | 2 +- apache-httpclient4/pom.xml | 2 +- aws-modules/aws-miscellaneous/pom.xml | 2 +- aws-modules/aws-s3/pom.xml | 2 +- core-java-modules/core-java-networking-2/pom.xml | 2 +- core-java-modules/core-java-numbers-6/pom.xml | 2 +- core-java-modules/core-java-security-2/pom.xml | 2 +- core-java-modules/core-java-security-3/pom.xml | 2 +- core-java-modules/core-java-string-operations-2/pom.xml | 2 +- httpclient-simple/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/algorithms-modules/pom.xml b/algorithms-modules/pom.xml index 342662ce9c..fda8eea0e7 100644 --- a/algorithms-modules/pom.xml +++ b/algorithms-modules/pom.xml @@ -28,7 +28,7 @@ - 1.11 + 1.16.0 3.6.1 2.7 1.0.1 diff --git a/apache-httpclient4/pom.xml b/apache-httpclient4/pom.xml index f4c213687e..8b2fd76f0e 100644 --- a/apache-httpclient4/pom.xml +++ b/apache-httpclient4/pom.xml @@ -234,7 +234,7 @@ - 1.10 + 1.16.0 4.1.5 2.5.1 diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index 5fdd7fa04d..b6326b6eb1 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -75,7 +75,7 @@ 2.10.1 1.21.1 - 1.10.L001 + 1.16.0 0.9.4.0006L 3.1.1 diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml index e2bc04964a..6cbdadabae 100644 --- a/aws-modules/aws-s3/pom.xml +++ b/aws-modules/aws-s3/pom.xml @@ -62,7 +62,7 @@ 2.20.52 - 1.10.L001 + 1.16.0 0.9.4.0006L diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 34f16a9938..388e439e37 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -56,7 +56,7 @@ 2.4.5 2.3.3 2.0.0-alpha-3 - 1.15 + 1.16.0 \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-6/pom.xml b/core-java-modules/core-java-numbers-6/pom.xml index 7a3b3d4426..66e16c8030 100644 --- a/core-java-modules/core-java-numbers-6/pom.xml +++ b/core-java-modules/core-java-numbers-6/pom.xml @@ -42,7 +42,7 @@ - 1.15 + 1.16.0 32.1.2-jre \ No newline at end of file diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml index 0fc121c070..05cd727638 100644 --- a/core-java-modules/core-java-security-2/pom.xml +++ b/core-java-modules/core-java-security-2/pom.xml @@ -34,7 +34,7 @@ 1.60 - 1.11 + 1.16.0 2.3.1 diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml index b979b56658..4633ba02e3 100644 --- a/core-java-modules/core-java-security-3/pom.xml +++ b/core-java-modules/core-java-security-3/pom.xml @@ -44,7 +44,7 @@ 1.70 - 1.15 + 1.16.0 2.3.1 6.0.3 diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index 383a3b4a40..27071e5427 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -87,7 +87,7 @@ 8.0.1.Final 5.0.0 - 1.14 + 1.16.0 5.3.0 diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index a6049432ce..8cbc1237c2 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/pom.xml @@ -205,7 +205,7 @@ 17 - 1.10 + 1.16.0 2.5.1 From d1675a28f48eaad3e8690fdab14ce4890d408764 Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 12 Nov 2023 16:45:31 +0100 Subject: [PATCH 504/831] JAVA-27461 | removing deprecations. --- spring-reactive-modules/spring-5-reactive/pom.xml | 0 .../webflux/functional/EmployeeFunctionalConfig.java | 9 ++++----- 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 spring-reactive-modules/spring-5-reactive/pom.xml diff --git a/spring-reactive-modules/spring-5-reactive/pom.xml b/spring-reactive-modules/spring-5-reactive/pom.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-reactive-modules/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java b/spring-reactive-modules/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java index e6f8ba35c2..7775f61467 100644 --- a/spring-reactive-modules/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java +++ b/spring-reactive-modules/spring-reactive/src/main/java/com/baeldung/reactive/webflux/functional/EmployeeFunctionalConfig.java @@ -53,11 +53,10 @@ public class EmployeeFunctionalConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http.csrf() - .disable() - .authorizeExchange() - .anyExchange() - .permitAll(); + http.csrf(csrf -> csrf.disable()) + .authorizeExchange( + exchanges -> exchanges.anyExchange().permitAll() + ); return http.build(); } } \ No newline at end of file From fe7f89a08fbadbd8e87f518fc82f243b8cc807db Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 17:46:52 +0200 Subject: [PATCH 505/831] [JAVA-26714] Upgraded bouncycastle to latest version --- core-java-modules/core-java-security-2/pom.xml | 4 ++-- core-java-modules/core-java-security-3/pom.xml | 4 ++-- core-java-modules/core-java-security-4/pom.xml | 4 ++-- libraries-security/pom.xml | 6 +++--- .../oauth2-authorization-server/pom.xml | 11 +++++------ 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml index 05cd727638..b54afc31d8 100644 --- a/core-java-modules/core-java-security-2/pom.xml +++ b/core-java-modules/core-java-security-2/pom.xml @@ -21,7 +21,7 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on ${bouncycastle.version} @@ -33,7 +33,7 @@ - 1.60 + 1.76 1.16.0 2.3.1 diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml index 4633ba02e3..dae570e51d 100644 --- a/core-java-modules/core-java-security-3/pom.xml +++ b/core-java-modules/core-java-security-3/pom.xml @@ -21,7 +21,7 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on ${bouncycastle.version} @@ -43,7 +43,7 @@ - 1.70 + 1.76 1.16.0 2.3.1 6.0.3 diff --git a/core-java-modules/core-java-security-4/pom.xml b/core-java-modules/core-java-security-4/pom.xml index 2b9809b749..a4700c34ba 100644 --- a/core-java-modules/core-java-security-4/pom.xml +++ b/core-java-modules/core-java-security-4/pom.xml @@ -16,7 +16,7 @@ org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on ${bouncycastle.version} @@ -27,7 +27,7 @@ - 1.70 + 1.76 1.2.6 diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml index 62c476a82c..969f14ec43 100644 --- a/libraries-security/pom.xml +++ b/libraries-security/pom.xml @@ -40,12 +40,12 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on ${bouncycastle.version} org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on ${bouncycastle.version} @@ -122,7 +122,7 @@ 1.2.2 1.2.2 1.9.2 - 1.58 + 1.76 0.1.55 2.5.1 2.4.0.RELEASE diff --git a/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml index 7f13e5acea..1ebbb5e10f 100644 --- a/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml +++ b/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml @@ -21,13 +21,13 @@ org.bouncycastle - bcprov-jdk15on - ${bcprov-jdk15on.version} + bcprov-jdk18on + ${bouncycastle.version} org.bouncycastle - bcpkix-jdk15on - ${bcpkix-jdk15on.version} + bcpkix-jdk18on + ${bouncycastle.version} @@ -69,8 +69,7 @@ 9080 9443 7.3 - 1.62 - 1.62 + 1.76 \ No newline at end of file From c0a9532c647bfee5f6a68d6e4550636940cbd4de Mon Sep 17 00:00:00 2001 From: Lucian Snare Date: Sun, 12 Nov 2023 10:59:00 -0500 Subject: [PATCH 506/831] BAEL-6790: Write and Read file with HashMap (#15087) * Add examples for reading and writing a HashMap from a file * Add test for gson --- .../core-java-collections-maps-7/README.md | 4 +- .../core-java-collections-maps-7/pom.xml | 65 ++------- .../map/readandwritefile/Student.java | 51 +++++++ .../ReadAndWriteFileWithHashMapUnitTest.java | 135 ++++++++++++++++++ 4 files changed, 199 insertions(+), 56 deletions(-) create mode 100644 core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/readandwritefile/Student.java create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/readandwritefile/ReadAndWriteFileWithHashMapUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 2e1531050e..a62bdda7af 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -1,5 +1,7 @@ -## Relevant Articles +## Relevant Articles: - [Difference Between putIfAbsent() and computeIfAbsent() in Java’s Map](https://www.baeldung.com/java-map-putifabsent-computeifabsent) +- [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/how-to-write-and-read-a-file-with-a-java-hashmap/) - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index cefee201cc..a7acded9cf 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -1,11 +1,15 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-collections-maps-7 core-java-collections-maps-7 jar + + 2.10.1 + 1.5 + core-java-modules @@ -13,72 +17,24 @@ 0.0.1-SNAPSHOT - - 5.2.5.RELEASE - com.fasterxml.jackson.core jackson-databind - 2.12.4 - - - org.openjdk.jmh - jmh-core - 1.36 + ${jackson.version} com.google.code.gson gson - 2.8.9 - - - org.json - json - 20230227 - - - junit - junit - 4.13.1 - test - - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - junit - junit - 4.13.1 - test - - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - junit - junit - 4.13.1 - test + ${gson.version} org.apache.commons commons-csv - 1.5 + ${csv.version} + @@ -92,5 +48,4 @@ - diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/readandwritefile/Student.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/readandwritefile/Student.java new file mode 100644 index 0000000000..b981de6300 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/readandwritefile/Student.java @@ -0,0 +1,51 @@ +package com.baeldung.map.readandwritefile; + +import java.io.Serializable; +import java.util.Objects; + +public class Student implements Serializable { + private static final long serialVersionUID = 1L; + private String firstName; + private String lastName; + + /** Default constructor for JSON serialization */ + public Student() { + + } + + public Student(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Student student = (Student) o; + return Objects.equals(firstName, student.firstName) && Objects.equals(lastName, student.lastName); + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/readandwritefile/ReadAndWriteFileWithHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/readandwritefile/ReadAndWriteFileWithHashMapUnitTest.java new file mode 100644 index 0000000000..56867d3885 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/readandwritefile/ReadAndWriteFileWithHashMapUnitTest.java @@ -0,0 +1,135 @@ +package com.baeldung.map.readandwritefile; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.junit.After; +import org.junit.Test; +import org.junit.Before; + +public class ReadAndWriteFileWithHashMapUnitTest { + + private static final Map STUDENT_DATA = new HashMap<>(); + + static { + STUDENT_DATA.put(1234, new Student("Henry", "Winter")); + STUDENT_DATA.put(5678, new Student("Richard", "Papen")); + } + + private File file; + + @Before + public void createFile() throws IOException { + file = File.createTempFile("student", ".data"); + } + + @After + public void deleteFile() { + file.delete(); + } + + @Test + public void givenHashMap_whenWrittenAsPropertiesFile_thenReloadedMapIsIdentical() throws IOException { + // Given a map containing student data + Map studentData = new HashMap<>(); + studentData.put("student.firstName", "Henry"); + studentData.put("student.lastName", "Winter"); + + // When converting to a Properties object and writing to a file + Properties props = new Properties(); + props.putAll(studentData); + try (OutputStream output = Files.newOutputStream(file.toPath())) { + props.store(output, null); + } + + // Then the map resulting from loading the Properties file is identical + Properties propsFromFile = new Properties(); + try (InputStream input = Files.newInputStream(file.toPath())) { + propsFromFile.load(input); + } + + Map studentDataFromProps = propsFromFile.stringPropertyNames() + .stream() + .collect(Collectors.toMap(key -> key, props::getProperty)); + assertThat(studentDataFromProps).isEqualTo(studentData); + } + + @Test + public void givenHashMap_whenSerializedToFile_thenDeserializedMapIsIdentical() throws IOException, ClassNotFoundException { + // Given a map containing student data (STUDENT_DATA) + + // When serializing the map to a file + try (FileOutputStream fileOutput = new FileOutputStream(file); ObjectOutputStream objectStream = new ObjectOutputStream(fileOutput)) { + objectStream.writeObject(STUDENT_DATA); + } + + // Then read the file back into a map and check the contents + Map studentsFromFile; + try (FileInputStream fileReader = new FileInputStream(file); ObjectInputStream objectStream = new ObjectInputStream(fileReader)) { + studentsFromFile = (HashMap) objectStream.readObject(); + } + assertThat(studentsFromFile).isEqualTo(STUDENT_DATA); + } + + @Test + public void givenHashMap_whenSerializedToFileWithJackson_thenDeserializedMapIsIdentical() throws IOException { + // Given a map containing student data (STUDENT_DATA) + + // When converting to JSON with Jackson and writing to a file + ObjectMapper mapper = new ObjectMapper(); + try (FileOutputStream fileOutput = new FileOutputStream(file)) { + mapper.writeValue(fileOutput, STUDENT_DATA); + } + + // Then deserialize the file back into a map and check that it's identical + Map mapFromFile; + try (FileInputStream fileInput = new FileInputStream(file)) { + // Create a TypeReference so we can deserialize the parameterized type + TypeReference> mapType = new TypeReference>() { + }; + mapFromFile = mapper.readValue(fileInput, mapType); + } + assertThat(mapFromFile).isEqualTo(STUDENT_DATA); + } + + @Test + public void givenHashMap_whenSerializedToFileWithGson_thenDeserializedMapIsIdentical() throws IOException { + // Given a map containing student data (STUDENT_DATA) + + // When converting to JSON using Gson and writing to a file + Gson gson = new Gson(); + try (FileWriter writer = new FileWriter(file)) { + gson.toJson(STUDENT_DATA, writer); + } + + // Then deserialize the file back into a map and check that it's identical + Map studentsFromFile; + try (FileReader reader = new FileReader(file)) { + Type mapType = new TypeToken>() { + }.getType(); + studentsFromFile = gson.fromJson(reader, mapType); + } + assertThat(studentsFromFile).isEqualTo(STUDENT_DATA); + } +} From 2c7a0d05e2a823cc74889d9e3ced74538f7c0bf0 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 18:00:46 +0200 Subject: [PATCH 507/831] [JAVA-26714] Clean up of commons-lang3 --- core-java-modules/core-java-collections-4/pom.xml | 1 - core-java-modules/core-java-collections-list-5/pom.xml | 1 - core-java-modules/core-java-date-operations-3/pom.xml | 1 - core-java-modules/core-java-function/pom.xml | 1 - core-java-modules/core-java-functional/pom.xml | 1 - core-java-modules/core-java-lang-5/pom.xml | 1 - core-java-modules/core-java-reflection/pom.xml | 1 - core-java-modules/core-java-string-algorithms-3/pom.xml | 1 - core-java-modules/core-java-string-operations-3/pom.xml | 1 - core-java-modules/core-java-string-operations-4/pom.xml | 7 +++---- 10 files changed, 3 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml index 1a59411ecb..344ec6bc41 100644 --- a/core-java-modules/core-java-collections-4/pom.xml +++ b/core-java-modules/core-java-collections-4/pom.xml @@ -34,7 +34,6 @@ 2.2 - 3.12.0 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index 2b4b0041b3..b8832df357 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -66,7 +66,6 @@ 1.21 2.2 - 3.12.0 2.10.1 2.15.2 20230618 diff --git a/core-java-modules/core-java-date-operations-3/pom.xml b/core-java-modules/core-java-date-operations-3/pom.xml index 9b7be18b85..8e4740785c 100644 --- a/core-java-modules/core-java-date-operations-3/pom.xml +++ b/core-java-modules/core-java-date-operations-3/pom.xml @@ -28,7 +28,6 @@ 2.12.5 - 3.12.0 \ No newline at end of file diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml index e8b538ad24..4110b8f6d9 100644 --- a/core-java-modules/core-java-function/pom.xml +++ b/core-java-modules/core-java-function/pom.xml @@ -51,7 +51,6 @@ 3.8.0 3.22.0 - 3.12.0 0.10.4 diff --git a/core-java-modules/core-java-functional/pom.xml b/core-java-modules/core-java-functional/pom.xml index 4b0bf9f730..3b21dd6e8a 100644 --- a/core-java-modules/core-java-functional/pom.xml +++ b/core-java-modules/core-java-functional/pom.xml @@ -35,7 +35,6 @@ 3.8.0 3.22.0 - 3.12.0 0.10.4 diff --git a/core-java-modules/core-java-lang-5/pom.xml b/core-java-modules/core-java-lang-5/pom.xml index 8e95fc4405..b65f061fc7 100644 --- a/core-java-modules/core-java-lang-5/pom.xml +++ b/core-java-modules/core-java-lang-5/pom.xml @@ -24,7 +24,6 @@ - 3.12.0 0.10.2 diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml index a836ee4a22..f77c791936 100644 --- a/core-java-modules/core-java-reflection/pom.xml +++ b/core-java-modules/core-java-reflection/pom.xml @@ -52,7 +52,6 @@ 1.8 1.8 0.10.2 - 3.12.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml index 507e830e8a..c47967a29f 100644 --- a/core-java-modules/core-java-string-algorithms-3/pom.xml +++ b/core-java-modules/core-java-string-algorithms-3/pom.xml @@ -61,7 +61,6 @@ 11 11 1.7 - 3.12.0 5.1.1 1.10.0 diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml index 39167271fa..7795d164a1 100644 --- a/core-java-modules/core-java-string-operations-3/pom.xml +++ b/core-java-modules/core-java-string-operations-3/pom.xml @@ -70,7 +70,6 @@ 11 11 5.3.9 - 3.12.0 3.6.3 6.1.1 2.11.1 diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml index 27c2bf91bd..b9591763a0 100644 --- a/core-java-modules/core-java-string-operations-4/pom.xml +++ b/core-java-modules/core-java-string-operations-4/pom.xml @@ -27,12 +27,12 @@ org.apache.commons commons-lang3 - ${apache-commons-lang3.version} + ${commons-lang3.version} org.apache.commons commons-text - ${apache-commons-text.version} + ${commons-text.version} org.assertj @@ -60,8 +60,7 @@ 11 5.8 5.3.13 - 3.12.0 - 1.10.0 + 1.10.0 \ No newline at end of file From 573df300b06ea130e8d4762c71f4072ab0cfd81c Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Sun, 12 Nov 2023 09:00:56 -0700 Subject: [PATCH 508/831] Fix indentation issues --- .../atomicinteger/Employee.java | 3 +- .../synchronizestatic/none/Employee.java | 3 +- .../reentrantlock/Employee.java | 3 +- .../synchronizedblock/Employee.java | 3 +- .../synchronizedclass/Employee.java | 3 +- .../SychronizeStaticDataUnitTest.java | 38 ++++++++----------- 6 files changed, 21 insertions(+), 32 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java index 9c3c9b987c..bb7c1c6b4c 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/atomicinteger/Employee.java @@ -13,8 +13,7 @@ public class Employee { String name; String title; - public Employee(int id, String name, String title) - { + public Employee(int id, String name, String title) { incrementCount(); this.id = id; this.name = name; diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java index f050a68be4..ba722e15e9 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/none/Employee.java @@ -10,8 +10,7 @@ public class Employee { String name; String title; - public Employee(int id, String name, String title) - { + public Employee(int id, String name, String title) { incrementCount(); this.id = id; this.name = name; diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java index 2ac0b0d3f2..e74013ad0e 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/reentrantlock/Employee.java @@ -14,8 +14,7 @@ public class Employee { String name; String title; - public Employee(int id, String name, String title) - { + public Employee(int id, String name, String title) { incrementCount(); this.id = id; this.name = name; diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java index 9c078e7abe..4cf04e5b06 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedblock/Employee.java @@ -12,8 +12,7 @@ public class Employee { String name; String title; - public Employee(int id, String name, String title) - { + public Employee(int id, String name, String title) { incrementCount(); this.id = id; this.name = name; diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java index a69b633f3b..627040e88c 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/synchronizestatic/synchronizedclass/Employee.java @@ -10,8 +10,7 @@ public class Employee String name; String title; - public Employee(int id, String name, String title) - { + public Employee(int id, String name, String title) { incrementCount(); this.id = id; this.name = name; diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java index e633005c6f..b4e03673a1 100644 --- a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/synchronizestatic/SychronizeStaticDataUnitTest.java @@ -11,8 +11,7 @@ import java.util.concurrent.Executors; * package. When not synchronized the out will not be sequential; * when it is synchronized the output will be in sequential. */ -public class SychronizeStaticDataUnitTest -{ +public class SychronizeStaticDataUnitTest { private final Executor pool = Executors.newFixedThreadPool(4); private final int numberToTest = 100; @@ -24,10 +23,9 @@ public class SychronizeStaticDataUnitTest for(int i = 0; i < numberToTest; i++) { int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.none.Employee(finalI, "John", "Smith"); - }); + pool.execute(() -> { + new com.baeldung.concurrent.synchronizestatic.none.Employee(finalI, "John", "Smith"); + }); } } @@ -38,10 +36,9 @@ public class SychronizeStaticDataUnitTest for(int i = 0; i < numberToTest; i++) { int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.synchronizedmethod.Employee(finalI, "John", "Smith"); - }); + pool.execute(() -> { + new com.baeldung.concurrent.synchronizestatic.synchronizedmethod.Employee(finalI, "John", "Smith"); + }); } } @@ -52,10 +49,9 @@ public class SychronizeStaticDataUnitTest for(int i = 0; i < numberToTest; i++) { int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.synchronizedclass.Employee(finalI, "John", "Smith"); - }); + pool.execute(() -> { + new com.baeldung.concurrent.synchronizestatic.synchronizedclass.Employee(finalI, "John", "Smith"); + }); } } @@ -66,10 +62,9 @@ public class SychronizeStaticDataUnitTest for(int i = 0; i < numberToTest; i++) { int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.synchronizedblock.Employee(finalI, "John", "Smith"); - }); + pool.execute(() -> { + new com.baeldung.concurrent.synchronizestatic.synchronizedblock.Employee(finalI, "John", "Smith"); + }); } } @@ -87,10 +82,9 @@ public class SychronizeStaticDataUnitTest for(int i = 0; i < numberToTest; i++) { int finalI = i; - pool.execute(() -> - { - new com.baeldung.concurrent.synchronizestatic.reentrantlock.Employee(finalI, "John", "Smith"); - }); + pool.execute(() -> { + new com.baeldung.concurrent.synchronizestatic.reentrantlock.Employee(finalI, "John", "Smith"); + }); } } } From daea7e1edc1f746e4c1a1a3afc3c6ba5637a7033 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 18:03:56 +0200 Subject: [PATCH 509/831] [JAVA-26714] Revert typo --- aws-modules/aws-s3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml index 6cbdadabae..e2bc04964a 100644 --- a/aws-modules/aws-s3/pom.xml +++ b/aws-modules/aws-s3/pom.xml @@ -62,7 +62,7 @@ 2.20.52 - 1.16.0 + 1.10.L001 0.9.4.0006L From 39c2f491713a429cd5f9c5b3b45eb62165ed0a0e Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sun, 12 Nov 2023 18:10:31 +0200 Subject: [PATCH 510/831] [JAVA-26714] Upgraded guava to latest version --- core-java-modules/core-java-numbers-6/pom.xml | 1 - core-java-modules/core-java-streams-5/pom.xml | 1 - docker-modules/docker-caching/multi-module-caching/pom.xml | 2 +- docker-modules/docker-caching/single-module-caching/pom.xml | 2 +- json-modules/json-conversion/pom.xml | 1 - pom.xml | 2 +- spring-web-modules/spring-rest-http-2/pom.xml | 1 - 7 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-numbers-6/pom.xml b/core-java-modules/core-java-numbers-6/pom.xml index 66e16c8030..34e53056a4 100644 --- a/core-java-modules/core-java-numbers-6/pom.xml +++ b/core-java-modules/core-java-numbers-6/pom.xml @@ -43,6 +43,5 @@ 1.16.0 - 32.1.2-jre \ No newline at end of file diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index d7baf84d30..e217271f4c 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -77,7 +77,6 @@ 12 12 0.10.2 - 32.1.2-jre \ No newline at end of file diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index 60f14a17e5..bebfb85e8a 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/pom.xml @@ -27,7 +27,7 @@ UTF-8 1.8 - 32.1.2-jre + 32.1.3-jre \ No newline at end of file diff --git a/docker-modules/docker-caching/single-module-caching/pom.xml b/docker-modules/docker-caching/single-module-caching/pom.xml index 0e5174b7ca..bb44c21e10 100644 --- a/docker-modules/docker-caching/single-module-caching/pom.xml +++ b/docker-modules/docker-caching/single-module-caching/pom.xml @@ -49,7 +49,7 @@ 8 8 UTF-8 - 32.1.2-jre + 32.1.3-jre \ No newline at end of file diff --git a/json-modules/json-conversion/pom.xml b/json-modules/json-conversion/pom.xml index 638216f4c5..9eebac16b4 100644 --- a/json-modules/json-conversion/pom.xml +++ b/json-modules/json-conversion/pom.xml @@ -38,7 +38,6 @@ 2.10.1 - 32.1.2-jre diff --git a/pom.xml b/pom.xml index 47c566023d..7099dd8cbc 100644 --- a/pom.xml +++ b/pom.xml @@ -1236,7 +1236,7 @@ 3.21.0 1.18.28 2.1.214 - 32.1.2-jre + 32.1.3-jre 3.3.0 diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml index 88294c7811..bcacdbbdb1 100644 --- a/spring-web-modules/spring-rest-http-2/pom.xml +++ b/spring-web-modules/spring-rest-http-2/pom.xml @@ -53,7 +53,6 @@ 2.9.2 1.6.1 1.7.0 - 31.0.1-jre \ No newline at end of file From ffe2c5780ebad433ca55f67e5b53f5251b9e8f3e Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 13 Nov 2023 12:05:47 +0530 Subject: [PATCH 511/831] JAVA-27194 Upgarde hibernate validator version in spring-mvc-java --- spring-web-modules/spring-mvc-java/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/spring-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml index 8098f07282..745a6f45c0 100644 --- a/spring-web-modules/spring-mvc-java/pom.xml +++ b/spring-web-modules/spring-mvc-java/pom.xml @@ -101,7 +101,6 @@ org.hibernate.validator hibernate-validator - ${hibernate-validator.version} org.glassfish @@ -217,8 +216,6 @@ 6.0.10.Final 5.1.40 - - 6.0.10.Final 2.2.0 From 7465581d605e220bb4064d2b62d3f892ab4c8c28 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 13 Nov 2023 09:44:21 +0200 Subject: [PATCH 512/831] [JAVA-26714] --- core-java-modules/core-java-string-algorithms-3/pom.xml | 1 - core-java-modules/core-java-string-operations-3/pom.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml index c47967a29f..96bb824f84 100644 --- a/core-java-modules/core-java-string-algorithms-3/pom.xml +++ b/core-java-modules/core-java-string-algorithms-3/pom.xml @@ -21,7 +21,6 @@ org.apache.commons commons-lang3 - ${apache-commons-lang3.version} com.vdurmont diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml index 7795d164a1..ce58669ba0 100644 --- a/core-java-modules/core-java-string-operations-3/pom.xml +++ b/core-java-modules/core-java-string-operations-3/pom.xml @@ -22,7 +22,6 @@ org.apache.commons commons-lang3 - ${apache-commons-lang3.version} org.apache.maven From 0415bc0ec7093073f1fe4960dbc491ef2733ed11 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 13 Nov 2023 09:48:20 +0200 Subject: [PATCH 513/831] [JAVA-26714] --- core-java-modules/core-java-string-algorithms-3/pom.xml | 1 + core-java-modules/core-java-string-operations-3/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml index 96bb824f84..548a3dc3f8 100644 --- a/core-java-modules/core-java-string-algorithms-3/pom.xml +++ b/core-java-modules/core-java-string-algorithms-3/pom.xml @@ -21,6 +21,7 @@ org.apache.commons commons-lang3 + ${commons-lang3.version} com.vdurmont diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml index ce58669ba0..0558e71a35 100644 --- a/core-java-modules/core-java-string-operations-3/pom.xml +++ b/core-java-modules/core-java-string-operations-3/pom.xml @@ -22,6 +22,7 @@ org.apache.commons commons-lang3 + ${commons-lang3.version} org.apache.maven From 72391c6947feb37c1bf2783a57e7fe5ed9c7d246 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 13 Nov 2023 14:52:49 +0530 Subject: [PATCH 514/831] JAVA-27194 Upgrade hibernate validator version in spring-mvc-xml-2 --- spring-web-modules/spring-mvc-xml-2/pom.xml | 29 ++++++++----------- .../ConstraintViolationExceptionHandler.java | 2 +- ...stAndPathVariableValidationController.java | 10 +++---- .../baeldung/spring/taglibrary/Person.java | 2 +- .../spring/taglibrary/PersonController.java | 2 +- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/spring-web-modules/spring-mvc-xml-2/pom.xml b/spring-web-modules/spring-mvc-xml-2/pom.xml index 8c0062f538..49590758cc 100644 --- a/spring-web-modules/spring-mvc-xml-2/pom.xml +++ b/spring-web-modules/spring-mvc-xml-2/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-web-modules + parent-spring-6 0.0.1-SNAPSHOT + ../../parent-spring-6 @@ -19,26 +20,18 @@ org.springframework spring-web - ${spring.version} org.springframework spring-webmvc - ${spring.version} - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} + jakarta.servlet + jakarta.servlet-api + ${jakarta.servlet-api.version} provided - - javax.servlet - jstl - ${jstl.version} - runtime - org.hibernate.validator hibernate-validator @@ -57,9 +50,9 @@ ${commons-io.version} - org.glassfish - javax.el - ${javax.el.version} + org.glassfish.expressly + expressly + ${expressly.version} org.springframework.boot @@ -98,9 +91,11 @@ 5.1.40 4.4.5 4.5.2 - 6.0.10.Final - 3.0.1-b08 + 8.0.1.Final + 5.0.0 1.6.1 + 6.0.0 + 3.1.5 \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java index 645b36c2a5..d3d833a696 100644 --- a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; @ControllerAdvice public class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler { diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java index 4768237871..e1842564ac 100644 --- a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java @@ -7,11 +7,11 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; @Controller @RequestMapping("/public/api/1") diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java index ed2fa903ef..a08f0f515c 100644 --- a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java @@ -2,7 +2,7 @@ package com.baeldung.spring.taglibrary; import java.util.List; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotEmpty; import org.springframework.web.multipart.MultipartFile; diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java index 0fcb66f2dd..79e65b1fde 100644 --- a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java @@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; From 7d0c744c7c89d845b32cc4609fa98e40d876e2fd Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 13 Nov 2023 09:27:36 +0000 Subject: [PATCH 515/831] [JAVA-26433] Formatting (#15179) --- .../collectors/Java8CollectorsUnitTest.java | 155 ++++++++++-------- 1 file changed, 91 insertions(+), 64 deletions(-) diff --git a/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java index 085c1b5d7f..1faada9d23 100644 --- a/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java +++ b/core-java-modules/core-java-streams-simple/src/test/java/com/baeldung/streams/collectors/Java8CollectorsUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.streams.collectors; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; + import org.junit.Test; import java.util.*; @@ -23,142 +24,159 @@ public class Java8CollectorsUnitTest { private final List listWithDuplicates = Arrays.asList("a", "bb", "c", "d", "bb"); @Test - public void whenCollectingToList_shouldCollectToList() throws Exception { - final List result = givenList.stream().collect(toList()); + public void whenCollectingToList_shouldCollectToList() { + final List result = givenList.stream() + .collect(toList()); assertThat(result).containsAll(givenList); } @Test public void whenCollectingToUnmodifiableList_shouldCollectToUnmodifiableList() { - final List result = givenList.stream().collect(toUnmodifiableList()); + final List result = givenList.stream() + .collect(toUnmodifiableList()); - assertThatThrownBy(() -> result.add("foo")) - .isInstanceOf(UnsupportedOperationException.class); + assertThatThrownBy(() -> result.add("foo")).isInstanceOf(UnsupportedOperationException.class); } @Test - public void whenCollectingToSet_shouldCollectToSet() throws Exception { - final Set result = givenList.stream().collect(toSet()); + public void whenCollectingToSet_shouldCollectToSet() { + final Set result = givenList.stream() + .collect(toSet()); assertThat(result).containsAll(givenList); } @Test public void whenCollectingToUnmodifiableSet_shouldCollectToUnmodifiableSet() { - final Set result = givenList.stream().collect(toUnmodifiableSet()); + final Set result = givenList.stream() + .collect(toUnmodifiableSet()); - assertThatThrownBy(() -> result.add("foo")) - .isInstanceOf(UnsupportedOperationException.class); + assertThatThrownBy(() -> result.add("foo")).isInstanceOf(UnsupportedOperationException.class); } @Test public void givenContainsDuplicateElements_whenCollectingToSet_shouldAddDuplicateElementsOnlyOnce() throws Exception { - final Set result = listWithDuplicates.stream().collect(toSet()); + final Set result = listWithDuplicates.stream() + .collect(toSet()); assertThat(result).hasSize(4); } @Test - public void whenCollectingToCollection_shouldCollectToCollection() throws Exception { - final List result = givenList.stream().collect(toCollection(LinkedList::new)); + public void whenCollectingToCollection_shouldCollectToCollection() { + final List result = givenList.stream() + .collect(toCollection(LinkedList::new)); - assertThat(result).containsAll(givenList).isInstanceOf(LinkedList.class); + assertThat(result).containsAll(givenList) + .isInstanceOf(LinkedList.class); } @Test - public void whenCollectingToImmutableCollection_shouldThrowException() throws Exception { + public void whenCollectingToImmutableCollection_shouldThrowException() { assertThatThrownBy(() -> { - givenList.stream().collect(toCollection(ImmutableList::of)); + givenList.stream() + .collect(toCollection(ImmutableList::of)); }).isInstanceOf(UnsupportedOperationException.class); } @Test - public void whenCollectingToMap_shouldCollectToMap() throws Exception { - final Map result = givenList.stream().collect(toMap(Function.identity(), String::length)); + public void whenCollectingToMap_shouldCollectToMap() { + final Map result = givenList.stream() + .collect(toMap(Function.identity(), String::length)); - assertThat(result).containsEntry("a", 1).containsEntry("bb", 2).containsEntry("ccc", 3).containsEntry("dd", 2); + assertThat(result).containsEntry("a", 1) + .containsEntry("bb", 2) + .containsEntry("ccc", 3) + .containsEntry("dd", 2); } @Test public void whenCollectingToUnmodifiableMap_shouldCollectToUnmodifiableMap() { final Map result = givenList.stream() - .collect(toUnmodifiableMap(Function.identity(), String::length)); + .collect(toUnmodifiableMap(Function.identity(), String::length)); - assertThatThrownBy(() -> result.put("foo", 3)) - .isInstanceOf(UnsupportedOperationException.class); + assertThatThrownBy(() -> result.put("foo", 3)).isInstanceOf(UnsupportedOperationException.class); } @Test public void whenCollectingToMapwWithDuplicates_shouldCollectToMapMergingTheIdenticalItems() throws Exception { - final Map result = listWithDuplicates.stream().collect( - toMap( - Function.identity(), - String::length, - (item, identicalItem) -> item - ) - ); + final Map result = listWithDuplicates.stream() + .collect(toMap(Function.identity(), String::length, (item, identicalItem) -> item)); - assertThat(result).containsEntry("a", 1).containsEntry("bb", 2).containsEntry("c", 1).containsEntry("d", 1); + assertThat(result).containsEntry("a", 1) + .containsEntry("bb", 2) + .containsEntry("c", 1) + .containsEntry("d", 1); } @Test - public void givenContainsDuplicateElements_whenCollectingToMap_shouldThrowException() throws Exception { + public void givenContainsDuplicateElements_whenCollectingToMap_shouldThrowException() { assertThatThrownBy(() -> { - listWithDuplicates.stream().collect(toMap(Function.identity(), String::length)); + listWithDuplicates.stream() + .collect(toMap(Function.identity(), String::length)); }).isInstanceOf(IllegalStateException.class); } @Test - public void whenCollectingAndThen_shouldCollect() throws Exception { - final List result = givenList.stream().collect(collectingAndThen(toList(), ImmutableList::copyOf)); + public void whenCollectingAndThen_shouldCollect() { + final List result = givenList.stream() + .collect(collectingAndThen(toList(), ImmutableList::copyOf)); - assertThat(result).containsAll(givenList).isInstanceOf(ImmutableList.class); + assertThat(result).containsAll(givenList) + .isInstanceOf(ImmutableList.class); } @Test - public void whenJoining_shouldJoin() throws Exception { - final String result = givenList.stream().collect(joining()); + public void whenJoining_shouldJoin() { + final String result = givenList.stream() + .collect(joining()); assertThat(result).isEqualTo("abbcccdd"); } @Test - public void whenJoiningWithSeparator_shouldJoinWithSeparator() throws Exception { - final String result = givenList.stream().collect(joining(" ")); + public void whenJoiningWithSeparator_shouldJoinWithSeparator() { + final String result = givenList.stream() + .collect(joining(" ")); assertThat(result).isEqualTo("a bb ccc dd"); } @Test - public void whenJoiningWithSeparatorAndPrefixAndPostfix_shouldJoinWithSeparatorPrePost() throws Exception { - final String result = givenList.stream().collect(joining(" ", "PRE-", "-POST")); + public void whenJoiningWithSeparatorAndPrefixAndPostfix_shouldJoinWithSeparatorPrePost() { + final String result = givenList.stream() + .collect(joining(" ", "PRE-", "-POST")); assertThat(result).isEqualTo("PRE-a bb ccc dd-POST"); } @Test - public void whenPartitioningBy_shouldPartition() throws Exception { - final Map> result = givenList.stream().collect(partitioningBy(s -> s.length() > 2)); + public void whenPartitioningBy_shouldPartition() { + final Map> result = givenList.stream() + .collect(partitioningBy(s -> s.length() > 2)); - assertThat(result).containsKeys(true, false).satisfies(booleanListMap -> { - assertThat(booleanListMap.get(true)).contains("ccc"); + assertThat(result).containsKeys(true, false) + .satisfies(booleanListMap -> { + assertThat(booleanListMap.get(true)).contains("ccc"); - assertThat(booleanListMap.get(false)).contains("a", "bb", "dd"); - }); + assertThat(booleanListMap.get(false)).contains("a", "bb", "dd"); + }); } @Test - public void whenCounting_shouldCount() throws Exception { - final Long result = givenList.stream().collect(counting()); + public void whenCounting_shouldCount() { + final Long result = givenList.stream() + .collect(counting()); assertThat(result).isEqualTo(4); } @Test - public void whenSummarizing_shouldSummarize() throws Exception { - final DoubleSummaryStatistics result = givenList.stream().collect(summarizingDouble(String::length)); + public void whenSummarizing_shouldSummarize() { + final DoubleSummaryStatistics result = givenList.stream() + .collect(summarizingDouble(String::length)); assertThat(result.getAverage()).isEqualTo(2); assertThat(result.getCount()).isEqualTo(4); @@ -168,38 +186,47 @@ public class Java8CollectorsUnitTest { } @Test - public void whenAveraging_shouldAverage() throws Exception { - final Double result = givenList.stream().collect(averagingDouble(String::length)); + public void whenAveraging_shouldAverage() { + final Double result = givenList.stream() + .collect(averagingDouble(String::length)); assertThat(result).isEqualTo(2); } @Test - public void whenSumming_shouldSum() throws Exception { - final Double result = givenList.stream().filter(i -> true).collect(summingDouble(String::length)); + public void whenSumming_shouldSum() { + final Double result = givenList.stream() + .collect(summingDouble(String::length)); assertThat(result).isEqualTo(8); } @Test - public void whenMaxingBy_shouldMaxBy() throws Exception { - final Optional result = givenList.stream().collect(maxBy(Comparator.naturalOrder())); + public void whenMaxingBy_shouldMaxBy() { + final Optional result = givenList.stream() + .collect(maxBy(Comparator.naturalOrder())); - assertThat(result).isPresent().hasValue("dd"); + assertThat(result).isPresent() + .hasValue("dd"); } @Test - public void whenGroupingBy_shouldGroupBy() throws Exception { - final Map> result = givenList.stream().collect(groupingBy(String::length, toSet())); + public void whenGroupingBy_shouldGroupBy() { + final Map> result = givenList.stream() + .collect(groupingBy(String::length, toSet())); - assertThat(result).containsEntry(1, newHashSet("a")).containsEntry(2, newHashSet("bb", "dd")).containsEntry(3, newHashSet("ccc")); + assertThat(result).containsEntry(1, newHashSet("a")) + .containsEntry(2, newHashSet("bb", "dd")) + .containsEntry(3, newHashSet("ccc")); } @Test - public void whenCreatingCustomCollector_shouldCollect() throws Exception { - final ImmutableSet result = givenList.stream().collect(toImmutableSet()); + public void whenCreatingCustomCollector_shouldCollect() { + final ImmutableSet result = givenList.stream() + .collect(toImmutableSet()); - assertThat(result).isInstanceOf(ImmutableSet.class).contains("a", "bb", "ccc", "dd"); + assertThat(result).isInstanceOf(ImmutableSet.class) + .contains("a", "bb", "ccc", "dd"); } From e82269d2069859be8ef9e1b253c5b95b7d34256e Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 13 Nov 2023 15:02:17 +0530 Subject: [PATCH 516/831] JAVA-27224 Upgrade parent-boot-3 to latest version of Boot (#15188) --- parent-boot-3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parent-boot-3/pom.xml b/parent-boot-3/pom.xml index dabcd7850b..9f9d6f7901 100644 --- a/parent-boot-3/pom.xml +++ b/parent-boot-3/pom.xml @@ -230,7 +230,7 @@ 3.3.0 2.22.2 - 3.1.2 + 3.1.5 5.8.2 0.9.17 17 From 5040974af23bf29aec2fafb44ff94af538b7e026 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 13 Nov 2023 11:48:01 +0200 Subject: [PATCH 517/831] [JAVA-26714] --- libraries-security/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml index 969f14ec43..8a6dad6da2 100644 --- a/libraries-security/pom.xml +++ b/libraries-security/pom.xml @@ -40,12 +40,12 @@ org.bouncycastle - bcprov-jdk18on + bcprov-jdk15on ${bouncycastle.version} org.bouncycastle - bcpkix-jdk18on + bcpkix-jdk15on ${bouncycastle.version} @@ -122,7 +122,7 @@ 1.2.2 1.2.2 1.9.2 - 1.76 + 1.68 0.1.55 2.5.1 2.4.0.RELEASE From 21eb70547f10f84ac1be2b903f8a6d00742253ff Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 13 Nov 2023 10:00:45 +0000 Subject: [PATCH 518/831] [JAVA-26719] Upgraded joda-time to latest version (#15189) --- .../core-java-8-datetime-2/pom.xml | 2 +- .../parsingDates/SimpleParseDate.java | 2 +- .../parsingDates/SimpleParseDateUnitTest.java | 42 +++++++++---------- .../core-java-8-datetime/pom.xml | 2 +- .../core-java-date-operations-1/pom.xml | 2 +- .../core-java-date-operations-2/pom.xml | 2 +- .../core-java-datetime-conversion/pom.xml | 2 +- json-modules/gson/pom.xml | 2 +- .../spring-data-couchbase-2/pom.xml | 2 +- spring-ejb-modules/ejb-beans/pom.xml | 2 +- spring-static-resources/pom.xml | 7 ---- testing-modules/rest-assured/pom.xml | 6 --- video-tutorials/jackson-annotations/pom.xml | 2 +- 13 files changed, 30 insertions(+), 45 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/pom.xml b/core-java-modules/core-java-8-datetime-2/pom.xml index ce349d9dc3..02af06dc9d 100644 --- a/core-java-modules/core-java-8-datetime-2/pom.xml +++ b/core-java-modules/core-java-8-datetime-2/pom.xml @@ -55,7 +55,7 @@ 1.8 1.8 - 2.10 + 2.12.5 \ No newline at end of file diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java index cb024eea53..ba4f14ec5f 100644 --- a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/parsingDates/SimpleParseDate.java @@ -7,7 +7,7 @@ import java.util.List; public class SimpleParseDate { - public Date parseDate(String dateString, List formatStrings) { + public static Date parseDate(String dateString, List formatStrings) { for (String formatString : formatStrings) { try { return new SimpleDateFormat(formatString).parse(dateString); diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java index d7cbb6a834..ed8607fd96 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/parsingDates/SimpleParseDateUnitTest.java @@ -1,43 +1,41 @@ package com.baeldung.parsingDates; -import com.baeldung.parsingDates.SimpleDateTimeFormat; -import com.baeldung.parsingDates.SimpleDateTimeFormater; -import com.baeldung.parsingDates.SimpleDateUtils; -import com.baeldung.parsingDates.SimpleParseDate; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + import java.time.format.DateTimeParseException; import java.util.Arrays; -import org.junit.*; -import static org.junit.Assert.*; + import org.joda.time.LocalDate; +import org.junit.jupiter.api.Test; -public class SimpleParseDateUnitTest { +class SimpleParseDateUnitTest { @Test - public void whenInvalidInput_thenGettingUnexpectedResult() { - SimpleParseDate simpleParseDate = new SimpleParseDate(); + void whenInvalidInput_thenGettingUnexpectedResult() { String date = "2022-40-40"; - assertEquals("Sat May 10 00:00:00 UTC 2025", simpleParseDate.parseDate(date, Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd")).toString()); + assertEquals("Sat May 10 00:00:00 UTC 2025", SimpleParseDate.parseDate(date, Arrays.asList("MM/dd/yyyy", "dd.MM.yyyy", "yyyy-MM-dd")) + .toString()); } @Test - public void whenInvalidDate_thenAssertThrows() { - SimpleDateTimeFormater simpleDateTimeFormater = new SimpleDateTimeFormater(); - assertEquals(java.time.LocalDate.parse("2022-12-04"), simpleDateTimeFormater.parseDate("2022-12-04")); - assertThrows(DateTimeParseException.class, () -> simpleDateTimeFormater.parseDate("2022-13-04")); + void whenInvalidDate_thenAssertThrows() { + assertEquals(java.time.LocalDate.parse("2022-12-04"), SimpleDateTimeFormater.parseDate("2022-12-04")); + assertThrows(DateTimeParseException.class, () -> SimpleDateTimeFormater.parseDate("2022-13-04")); } @Test - public void whenDateIsCorrect_thenParseCorrect() { - SimpleDateUtils simpleDateUtils = new SimpleDateUtils(); - assertNull(simpleDateUtils.parseDate("53/10/2014")); - assertEquals("Wed Sep 10 00:00:00 UTC 2014", simpleDateUtils.parseDate("10/09/2014").toString()); + void whenDateIsCorrect_thenParseCorrect() { + assertNull(SimpleDateUtils.parseDate("53/10/2014")); + assertEquals("Wed Sep 10 00:00:00 UTC 2014", SimpleDateUtils.parseDate("10/09/2014") + .toString()); } @Test - public void whenDateIsCorrect_thenResultCorrect() { - SimpleDateTimeFormat simpleDateTimeFormat = new SimpleDateTimeFormat(); - assertNull(simpleDateTimeFormat.parseDate("53/10/2014")); - assertEquals(LocalDate.parse("2014-10-10"), simpleDateTimeFormat.parseDate("2014-10-10")); + void whenDateIsCorrect_thenResultCorrect() { + assertNull(SimpleDateTimeFormat.parseDate("53/10/2014")); + assertEquals(LocalDate.parse("2014-10-10"), SimpleDateTimeFormat.parseDate("2014-10-10")); } } diff --git a/core-java-modules/core-java-8-datetime/pom.xml b/core-java-modules/core-java-8-datetime/pom.xml index 481b1a6a69..06ecc3d017 100644 --- a/core-java-modules/core-java-8-datetime/pom.xml +++ b/core-java-modules/core-java-8-datetime/pom.xml @@ -56,7 +56,7 @@ 1.8 1.8 - 2.10 + 2.12.5 \ No newline at end of file diff --git a/core-java-modules/core-java-date-operations-1/pom.xml b/core-java-modules/core-java-date-operations-1/pom.xml index 5bfbb5bab0..3d7335c86e 100644 --- a/core-java-modules/core-java-date-operations-1/pom.xml +++ b/core-java-modules/core-java-date-operations-1/pom.xml @@ -54,7 +54,7 @@ - 2.10 + 2.12.5 RELEASE 1.9 1.9 diff --git a/core-java-modules/core-java-date-operations-2/pom.xml b/core-java-modules/core-java-date-operations-2/pom.xml index c6a22a4166..86fbbf614e 100644 --- a/core-java-modules/core-java-date-operations-2/pom.xml +++ b/core-java-modules/core-java-date-operations-2/pom.xml @@ -47,7 +47,7 @@ - 2.10 + 2.12.5 1.5.1 3.2.7.Final 5.9 diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml index 3ff26323df..8e148edaad 100644 --- a/core-java-modules/core-java-datetime-conversion/pom.xml +++ b/core-java-modules/core-java-datetime-conversion/pom.xml @@ -54,7 +54,7 @@ - 2.10 + 2.12.5 1.9 1.9 diff --git a/json-modules/gson/pom.xml b/json-modules/gson/pom.xml index ba968d9ae1..9e29bab3c4 100644 --- a/json-modules/gson/pom.xml +++ b/json-modules/gson/pom.xml @@ -65,7 +65,7 @@ 2.10.1 - 2.9.6 + 2.12.5 \ No newline at end of file diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml index 45462d477e..eda2c45371 100644 --- a/persistence-modules/spring-data-couchbase-2/pom.xml +++ b/persistence-modules/spring-data-couchbase-2/pom.xml @@ -72,7 +72,7 @@ 6.0.6 5.0.3 8.0.1.Final - 2.12.2 + 2.12.5 \ No newline at end of file diff --git a/spring-ejb-modules/ejb-beans/pom.xml b/spring-ejb-modules/ejb-beans/pom.xml index 94f7963ad6..6203db5f5a 100644 --- a/spring-ejb-modules/ejb-beans/pom.xml +++ b/spring-ejb-modules/ejb-beans/pom.xml @@ -192,7 +192,7 @@ 2.21.0 2.8 8.2.1.Final - 2.10.12 + 2.12.5 \ No newline at end of file diff --git a/spring-static-resources/pom.xml b/spring-static-resources/pom.xml index f682eafdbe..173c5a5af0 100644 --- a/spring-static-resources/pom.xml +++ b/spring-static-resources/pom.xml @@ -121,12 +121,6 @@ hibernate-validator ${hibernate-validator.version} - - - joda-time - joda-time - ${joda-time.version} - com.github.jknack @@ -196,7 +190,6 @@ 6.0.10.Final 4.1.0 - 2.10 1 1.5.1 diff --git a/testing-modules/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml index a4860b641d..d07e6d3b28 100644 --- a/testing-modules/rest-assured/pom.xml +++ b/testing-modules/rest-assured/pom.xml @@ -93,11 +93,6 @@ mail ${javax.mail.version} - - joda-time - joda-time - ${joda-time.version} - com.fasterxml.jackson.core jackson-annotations @@ -184,7 +179,6 @@ 4.5.2 0.9 8.0.0 - 2.9.6 1.1 1.2 2.27.2 diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index eaec50c1f7..611a337b0c 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -114,7 +114,7 @@ - 2.9.6 + 2.12.5 2.8.0 3.0.1 From 25a02eb86de26a26bb983f4dfa357480d8384247 Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 13 Nov 2023 12:24:40 +0100 Subject: [PATCH 519/831] fix: add only one spring boot app --- .../baeldung/overridebean/{basic => }/Config.java | 5 +---- .../overridebean/{basic => boot}/Application.java | 2 +- .../overridebean/conditional/Application.java | 14 -------------- .../baeldung/overridebean/profile/Application.java | 14 -------------- .../conditional/ConditionIntegrationTest.java | 1 + .../mockbean/MockBeanIntegrationTest.java | 2 +- .../OverrideBeanDefinitionIntegrationTest.java | 4 ++-- .../primary/PrimaryIntegrationTest.java | 4 ++-- .../profile/ProfileIntegrationTest.java | 1 + 9 files changed, 9 insertions(+), 38 deletions(-) rename spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/{basic => }/Config.java (64%) rename spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/{basic => boot}/Application.java (93%) delete mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java delete mode 100644 spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Config.java similarity index 64% rename from spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Config.java index 67d999958d..f0892338f8 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Config.java +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/Config.java @@ -1,11 +1,8 @@ -package com.baeldung.overridebean.basic; +package com.baeldung.overridebean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.baeldung.overridebean.Service; -import com.baeldung.overridebean.ServiceImpl; - @Configuration public class Config { diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/boot/Application.java similarity index 93% rename from spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/boot/Application.java index 6f9acde3d8..1eb0012493 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/basic/Application.java +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/boot/Application.java @@ -1,4 +1,4 @@ -package com.baeldung.overridebean.basic; +package com.baeldung.overridebean.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java deleted file mode 100644 index 9c4cdbf8ec..0000000000 --- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/conditional/Application.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.overridebean.conditional; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; - -@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java deleted file mode 100644 index d3298b2eb4..0000000000 --- a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/overridebean/profile/Application.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.overridebean.profile; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; - -@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java index 5f6b1d128f..b3a5164ff5 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionIntegrationTest.java @@ -12,6 +12,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, ConditionalConfig.class, Endpoint.class, ConditionalTestConfig.class }, properties = "service.stub=true") @AutoConfigureMockMvc diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java index 6a7be1cbda..2ece28482d 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java @@ -15,7 +15,7 @@ import org.springframework.test.web.servlet.MockMvc; import com.baeldung.overridebean.Endpoint; import com.baeldung.overridebean.Service; -import com.baeldung.overridebean.basic.Application; +import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, Endpoint.class }) @AutoConfigureMockMvc diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java index 0f3753ef34..a8dba58b79 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/overridebeandefinition/OverrideBeanDefinitionIntegrationTest.java @@ -11,9 +11,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; +import com.baeldung.overridebean.Config; import com.baeldung.overridebean.Endpoint; -import com.baeldung.overridebean.basic.Application; -import com.baeldung.overridebean.basic.Config; +import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, Config.class, Endpoint.class, OverrideBeanDefinitionTestConfig.class }, properties = "spring.main.allow-bean-definition-overriding=true") @AutoConfigureMockMvc diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java index 2bddfd4637..b6061c86d5 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/primary/PrimaryIntegrationTest.java @@ -11,9 +11,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; +import com.baeldung.overridebean.Config; import com.baeldung.overridebean.Endpoint; -import com.baeldung.overridebean.basic.Application; -import com.baeldung.overridebean.basic.Config; +import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, Config.class, Endpoint.class, PrimaryTestConfig.class }) @AutoConfigureMockMvc diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java index deabfea9e5..7f4aae026c 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java @@ -12,6 +12,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) @AutoConfigureMockMvc From 8325025cb7cddb8e7ffee50e533e65face3bfed3 Mon Sep 17 00:00:00 2001 From: Bipinkumar27 Date: Mon, 13 Nov 2023 23:08:31 +0530 Subject: [PATCH 520/831] JAVA-18764: Changes made for adding the H2 dependency for removing integration failure --- security-modules/cas/cas-secured-app/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/security-modules/cas/cas-secured-app/pom.xml b/security-modules/cas/cas-secured-app/pom.xml index 6e1b878354..7c4864b1c0 100644 --- a/security-modules/cas/cas-secured-app/pom.xml +++ b/security-modules/cas/cas-secured-app/pom.xml @@ -55,6 +55,11 @@ spring-security-test test + + com.h2database + h2 + ${h2.version} + From 5ecbb1b7c8c6fd4ccca44cbce687edd265278c85 Mon Sep 17 00:00:00 2001 From: mcasari Date: Mon, 13 Nov 2023 23:39:30 +0100 Subject: [PATCH 521/831] BAEL-6600: override put instead of additional method --- .../baeldung/map/HashMapWithMaxSizeLimit.java | 16 +++---- ...MaxSizeHashMapByCustomHashMapUnitTest.java | 41 ++++++++---------- ...MaxSizeHashMapByLinkedHashMapUnitTest.java | 42 +++++++++++-------- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java index 4d2d6e8d53..11845e6aa0 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -7,19 +7,21 @@ public class HashMapWithMaxSizeLimit extends HashMap { private static final long serialVersionUID = 1L; private int maxSize = -1; - - + public HashMapWithMaxSizeLimit(int maxSize) { super(); this.maxSize = maxSize; } - - public V putWithLimit(K key, V value) throws Exception { - if (this.maxSize != - 1 && this.size() >= this.maxSize && !this.containsKey(key)) { - throw new Exception("Max size exceeded!"); + @Override + public V put(K key, V value) { + V res = null; + if (this.maxSize == -1 || this.size() < this.maxSize) { + res = super.put(key, value); + } else if (this.maxSize != -1) { + throw new RuntimeException("Max size exceeded!"); } - return this.put(key, value); + return res; } } diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java index 5be9c61245..f351bcc3cc 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java @@ -1,8 +1,9 @@ package com.baeldung.map; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertThrows; -import java.util.LinkedHashMap; +import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -11,33 +12,27 @@ import org.junit.jupiter.api.Test; class LimitMaxSizeHashMapByCustomHashMapUnitTest { private final int MAX_SIZE = 4; - private LinkedHashMap linkedHashMap; + private HashMapWithMaxSizeLimit hashMapWithMaxSizeLimit; @BeforeEach void setUp() { - linkedHashMap = new LinkedHashMap() { - private static final long serialVersionUID = 1L; - - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_SIZE; - } - }; - linkedHashMap.put(1, "One"); - linkedHashMap.put(2, "Two"); - linkedHashMap.put(3, "Three"); - linkedHashMap.put(4, "Four"); + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); } @Test - void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { - linkedHashMap.put(5, "Five"); - String[] expectedArrayAfterFive = { "Two", "Three", "Four", "Five" }; - assertArrayEquals(expectedArrayAfterFive, linkedHashMap.values() - .toArray()); - linkedHashMap.put(6, "Six"); - String[] expectedArrayAfterSix = { "Three", "Four", "Five", "Six" }; - assertArrayEquals(expectedArrayAfterSix, linkedHashMap.values() - .toArray()); + void givenCustomHashMapObject_whenAddingNewEntryAndLimitExceeded_thenThrowsException() { + Exception exception = assertThrows(RuntimeException.class, () -> { + hashMapWithMaxSizeLimit.put(1, "One"); + hashMapWithMaxSizeLimit.put(2, "Two"); + hashMapWithMaxSizeLimit.put(3, "Three"); + hashMapWithMaxSizeLimit.put(4, "Four"); + hashMapWithMaxSizeLimit.put(5, "Five"); + }); + + String messageThrownWhenSizeExceedsLimit = "Max size exceeded!"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.equals(messageThrownWhenSizeExceedsLimit)); } } diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java index 20fcd94011..0986f426d9 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java @@ -1,7 +1,9 @@ package com.baeldung.map; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.util.LinkedHashMap; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -9,27 +11,33 @@ import org.junit.jupiter.api.Test; class LimitMaxSizeHashMapByLinkedHashMapUnitTest { private final int MAX_SIZE = 4; - private HashMapWithMaxSizeLimit hashMapWithMaxSizeLimit; + private LinkedHashMap linkedHashMap; @BeforeEach void setUp() { - hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + linkedHashMap = new LinkedHashMap() { + private static final long serialVersionUID = 1L; + + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_SIZE; + } + }; + linkedHashMap.put(1, "One"); + linkedHashMap.put(2, "Two"); + linkedHashMap.put(3, "Three"); + linkedHashMap.put(4, "Four"); } @Test - void givenCustomHashMapObject_whenAddingNewEntryAndLimitExceeded_thenThrowsException() { - Exception exception = assertThrows(Exception.class, () -> { - hashMapWithMaxSizeLimit.putWithLimit(1, "One"); - hashMapWithMaxSizeLimit.putWithLimit(2, "Two"); - hashMapWithMaxSizeLimit.putWithLimit(3, "Three"); - hashMapWithMaxSizeLimit.putWithLimit(4, "Four"); - hashMapWithMaxSizeLimit.putWithLimit(5, "Five"); - }); - - String messageThrownWhenSizeExceedsLimit = "Max size exceeded!"; - String actualMessage = exception.getMessage(); - - assertTrue(actualMessage.equals(messageThrownWhenSizeExceedsLimit)); + void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { + linkedHashMap.put(5, "Five"); + String[] expectedArrayAfterFive = { "Two", "Three", "Four", "Five" }; + assertArrayEquals(expectedArrayAfterFive, linkedHashMap.values() + .toArray()); + linkedHashMap.put(6, "Six"); + String[] expectedArrayAfterSix = { "Three", "Four", "Five", "Six" }; + assertArrayEquals(expectedArrayAfterSix, linkedHashMap.values() + .toArray()); } } From 9973d9aec3dbc58db08de0c4eb9d4274710696db Mon Sep 17 00:00:00 2001 From: mcasari Date: Mon, 13 Nov 2023 23:51:31 +0100 Subject: [PATCH 522/831] BAEL-6600: minor fixing --- .../map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java index f351bcc3cc..09b2e2122a 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java @@ -3,9 +3,6 @@ package com.baeldung.map; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertThrows; -import java.util.HashMap; -import java.util.Map; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From f8e9ed2925735ff03f26c968769c2a0a82930dcd Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Tue, 14 Nov 2023 05:35:36 +0100 Subject: [PATCH 523/831] Converting a File to a MultipartFile (#15180) * Converting a File to a MultipartFile * Converting a File to a MultipartFile --- spring-web-modules/spring-mvc-java-2/pom.xml | 6 +++ .../ConvertFileToMultipartFileUnitTest.java | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/multipart/file/ConvertFileToMultipartFileUnitTest.java diff --git a/spring-web-modules/spring-mvc-java-2/pom.xml b/spring-web-modules/spring-mvc-java-2/pom.xml index d88a9c320a..b1b5a797f8 100644 --- a/spring-web-modules/spring-mvc-java-2/pom.xml +++ b/spring-web-modules/spring-mvc-java-2/pom.xml @@ -41,6 +41,11 @@ jaxb-runtime ${jaxb-runtime.version} + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + @@ -57,6 +62,7 @@ 4.0.1 5.2.2.RELEASE 2.3.5 + 1.5 \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/multipart/file/ConvertFileToMultipartFileUnitTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/multipart/file/ConvertFileToMultipartFileUnitTest.java new file mode 100644 index 0000000000..7d99f7f9bb --- /dev/null +++ b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/multipart/file/ConvertFileToMultipartFileUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.multipart.file; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; +import org.springframework.mock.web.MockMultipartFile; + +public class ConvertFileToMultipartFileUnitTest { + + @Test + public void givenFile_whenCreateMultipartFile_thenContentMatch() throws IOException { + File file = new File("src/main/resources/targetFile.tmp"); + byte[] fileBytes = Files.readAllBytes(file.toPath()); + MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", fileBytes); + String fileContent = new String(multipartFile.getBytes()); + assertEquals("Hello World", fileContent); + assertEquals("targetFile.tmp", multipartFile.getOriginalFilename()); + } + + @Test + public void givenFile_whenCreateMultipartFileUsingCommonsMultipart_thenContentMatch() throws IOException { + File file = new File("src/main/resources/targetFile.tmp"); + FileItem fileItem = new DiskFileItem("file", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile()); + InputStream input = new FileInputStream(file); + OutputStream outputStream = fileItem.getOutputStream(); + IOUtils.copy(input, outputStream); + MultipartFile multipartFile = new CommonsMultipartFile(fileItem); + String fileContent = new String(multipartFile.getBytes()); + assertEquals("Hello World", fileContent); + assertEquals("targetFile.tmp", multipartFile.getOriginalFilename()); + } + +} From b38b5327fd82481b3828e453286e1b2eddc7324f Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 14 Nov 2023 07:30:13 +0200 Subject: [PATCH 524/831] [JAVA-26731] Upgraded bucket4j-spring-boot-starter version --- spring-boot-modules/spring-boot-libraries/pom.xml | 10 +++++++--- .../ratelimiting/application-bucket4j-starter.yml | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index ed9a414a60..b0f0c780aa 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -18,6 +18,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-validation + org.springframework.boot spring-boot-starter-security @@ -95,7 +99,7 @@ - com.github.vladimir-bukhtoyarov + com.bucket4j bucket4j-core ${bucket4j.version} @@ -226,8 +230,8 @@ 2.1 2.6.0 3.3.0 - 7.6.0 - 0.7.0 + 8.1.0 + 0.8.1 3.1.8 diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml index ecc9f22e0a..efff65555b 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/ratelimiting/application-bucket4j-starter.yml @@ -21,19 +21,19 @@ bucket4j: url: /api/v1/area.* http-response-body: "{ \"status\": 429, \"error\": \"Too Many Requests\", \"message\": \"You have exhausted your API Request Quota\" }" rate-limits: - - expression: "getHeader('X-api-key')" + - cache-key: "getHeader('X-api-key')" execute-condition: "getHeader('X-api-key').startsWith('PX001-')" bandwidths: - capacity: 100 time: 1 unit: hours - - expression: "getHeader('X-api-key')" + - cache-key: "getHeader('X-api-key')" execute-condition: "getHeader('X-api-key').startsWith('BX001-')" bandwidths: - capacity: 40 time: 1 unit: hours - - expression: "getHeader('X-api-key')" + - cache-key: "getHeader('X-api-key')" bandwidths: - capacity: 20 time: 1 From 8532499dcc839936968894ce06747c454c4d30a7 Mon Sep 17 00:00:00 2001 From: Mikhail Polivakha <68962645+Mikhail2048@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:40:27 +0300 Subject: [PATCH 525/831] BAEL-7187 implemented (#15208) * BAEL-7139 implemented * BAEL-7187 implemented --- ...tableFutureExceptionsHandlingUnitTest.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/exceptions_completablefuture/CompletableFutureExceptionsHandlingUnitTest.java diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/exceptions_completablefuture/CompletableFutureExceptionsHandlingUnitTest.java b/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/exceptions_completablefuture/CompletableFutureExceptionsHandlingUnitTest.java new file mode 100644 index 0000000000..afb31f7617 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/test/java/com/baeldung/exceptions_completablefuture/CompletableFutureExceptionsHandlingUnitTest.java @@ -0,0 +1,126 @@ +package com.baeldung.exceptions_completablefuture; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.stream.Stream; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class CompletableFutureExceptionsHandlingUnitTest { + + @ParameterizedTest + @MethodSource("parametersSource_handle") + void whenCompletableFutureIsScheduled_thenHandleStageIsAlwaysInvoked(int radius, long expected) + throws ExecutionException, InterruptedException { + long actual = CompletableFuture + .supplyAsync(() -> { + if (radius <= 0) { + throw new IllegalArgumentException("Supplied with non-positive radius '%d'"); + } + return Math.round(Math.pow(radius, 2) * Math.PI); + }) + .handle((result, ex) -> { + if (ex == null) { + return result; + } else { + return -1L; + } + }) + .get(); + + Assertions.assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("parametersSource_exceptionally") + void whenCompletableFutureIsScheduled_thenExceptionallyExecutedOnlyOnFailure(int a, int b, int c, long expected) + throws ExecutionException, InterruptedException { + long actual = CompletableFuture + .supplyAsync(() -> { + if (a <= 0 || b <= 0 || c <= 0) { + throw new IllegalArgumentException(String.format("Supplied with incorrect edge length [%s]", List.of(a, b, c))); + } + return a * b * c; + }) + .exceptionally((ex) -> -1) + .get(); + + Assertions.assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("parametersSource_exceptionally") + void givenCompletableFutureIsScheduled_whenHandleIsAlreadyPresent_thenExceptionallyIsNotExecuted(int a, int b, int c, long expected) + throws ExecutionException, InterruptedException { + long actual = CompletableFuture + .supplyAsync(() -> { + if (a <= 0 || b <= 0 || c <= 0) { + throw new IllegalArgumentException(String.format("Supplied with incorrect edge length [%s]", List.of(a, b, c))); + } + return a * b * c; + }) + .handle((result, throwable) -> { + if (throwable != null) { + return -1; + } + return result; + }) + .exceptionally((ex) -> { + System.exit(1); + return 0; + }) + .get(); + + Assertions.assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("parametersSource_whenComplete") + void whenCompletableFutureIsScheduled_thenWhenCompletedExecutedAlways(Double a, long expected, Class ifAny) { + try { + CountDownLatch countDownLatch = new CountDownLatch(1); + + long actual = CompletableFuture + .supplyAsync(() -> { + if (a.isNaN()) { + throw new IllegalArgumentException("Supplied value is NaN"); + } + return Math.round(Math.pow(a, 2)); + }) + .whenComplete((result, exception) -> countDownLatch.countDown()) + .get(); + + Assertions.assertThat(countDownLatch.await(20L, java.util.concurrent.TimeUnit.SECONDS)); + Assertions.assertThat(actual).isEqualTo(expected); + } catch (Exception e) { + Assertions.assertThat(e.getClass()).isSameAs(ExecutionException.class); + Assertions.assertThat(e.getCause().getClass()).isSameAs(ifAny); + } + } + + static Stream parametersSource_handle() { + return Stream.of( + Arguments.of(1, 3), + Arguments.of(-1, -1) + ); + } + + static Stream parametersSource_exceptionally() { + return Stream.of( + Arguments.of(1, 5, 5, 25), + Arguments.of(-1, 10, 15, -1) + ); + } + + static Stream parametersSource_whenComplete() { + return Stream.of( + Arguments.of(2d, 4, null), + Arguments.of(Double.NaN, 1, IllegalArgumentException.class) + ); + } +} From 122ca1a996bb2e014d840eaf879e99dc7432371a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 14 Nov 2023 11:17:53 +0530 Subject: [PATCH 526/831] JAVA-27197 Upgrade hibernate-validator version in spring-thymeleaf-5 module --- spring-web-modules/spring-thymeleaf-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-thymeleaf-5/pom.xml b/spring-web-modules/spring-thymeleaf-5/pom.xml index 0717e41bac..2d178bd933 100644 --- a/spring-web-modules/spring-thymeleaf-5/pom.xml +++ b/spring-web-modules/spring-thymeleaf-5/pom.xml @@ -139,7 +139,7 @@ 3.0.4.RELEASE 2.4.1 2.0.1.Final - 6.0.11.Final + 8.0.1.Final 1.6.1 From c5af2f3f3b9b6143b2536d9ce430b0a444a59ff6 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Tue, 14 Nov 2023 07:53:16 +0200 Subject: [PATCH 527/831] This PR is related to BAEL-7181 (#15192) * This commit is related to BAEL-7181 This commit aims to add a class "TimestampToLong.java" that provides several approaches to convert timestamp string into long. * This commit is related to BAEL-7181 This commit aims to add a test class "TimestampToLongUnitTest.java" that provides several approaches to convert timestamp string into long. --- .../timestamptolong/TimestampToLong.java | 32 ++++++++++++ .../TimestampToLongUnitTest.java | 52 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java new file mode 100644 index 0000000000..2ebe30f4ff --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java @@ -0,0 +1,32 @@ +package com.baeldung.timestamptolong; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +public class TimestampToLong { + public void usingSimpleDateFormat() throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String currentDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + long actualTimestamp = sdf.parse(currentDateString).getTime(); + } + + public void usingInstantClass() { + Instant instant = Instant.now(); + long actualTimestamp = instant.toEpochMilli(); + } + + public void usingTimestamp() { + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + long actualTimestamp = timestamp.getTime(); + } + + public void usingJava8DateTime() { + LocalDateTime localDateTime = LocalDateTime.now(); + long actualTimestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java new file mode 100644 index 0000000000..ede8f7792d --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.timestamptolong; + +import org.junit.Test; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +import static org.junit.Assert.assertTrue; + +public class TimestampToLongUnitTest { + + private static final long TOLERANCE = 1000; + + @Test + public void givenSimpleDateFormat_whenFormattingDate_thenTConvertToLong() throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + String currentDateString = sdf.format(new Date()); + long actualTimestamp = sdf.parse(currentDateString).getTime(); + + assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + } + + @Test + public void givenInstantClass_whenGettingTimestamp_thenTConvertToLong() { + Instant instant = Instant.now(); + long actualTimestamp = instant.toEpochMilli(); + + assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + } + + @Test + public void givenTimestamp_whenCreatingTimestamp_thenTConvertToLong() { + Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + long actualTimestamp = timestamp.getTime(); + + assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + } + + @Test + public void givenJava8DateTime_whenGettingTimestamp_thenTConvertToLong() { + LocalDateTime localDateTime = LocalDateTime.now(); + long actualTimestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + + assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + } +} From f94f248f5a52c110615c827212eefe30b1d2cd82 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 14 Nov 2023 11:25:35 +0530 Subject: [PATCH 528/831] JAVA-27196 Upgrade hibernate-validator version in spring-mvc-xml module --- spring-web-modules/spring-mvc-xml/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-mvc-xml/pom.xml b/spring-web-modules/spring-mvc-xml/pom.xml index bf0dc52b68..12f0a1a68a 100644 --- a/spring-web-modules/spring-mvc-xml/pom.xml +++ b/spring-web-modules/spring-mvc-xml/pom.xml @@ -142,7 +142,7 @@ 4.4.5 4.5.2 - 6.0.10.Final + 8.0.1.Final 3.0.1-b08 2.8.0 From 68f4c0517caaca2dc5e4fb41fa0e31aacd0fa761 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 14 Nov 2023 11:50:54 +0530 Subject: [PATCH 529/831] JAVA-27198 Upgrade hibernate-validator version in spring-thymeleaf module --- spring-web-modules/spring-thymeleaf/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-thymeleaf/pom.xml b/spring-web-modules/spring-thymeleaf/pom.xml index 94ae05ca11..ce0c0a7e21 100644 --- a/spring-web-modules/spring-thymeleaf/pom.xml +++ b/spring-web-modules/spring-thymeleaf/pom.xml @@ -140,7 +140,7 @@ 3.0.4.RELEASE 2.4.1 2.0.1.Final - 6.0.11.Final + 8.0.1.Final 1.9.9 From bf4cc41cb4a77ea0b2be2124bb72af3647a7c7c5 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 14 Nov 2023 12:24:10 +0530 Subject: [PATCH 530/831] JAVA-27199 Upgrade hibernate validator version in vraptor module --- web-modules/vraptor/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml index ecc6fe3313..25f8b5d5e5 100644 --- a/web-modules/vraptor/pom.xml +++ b/web-modules/vraptor/pom.xml @@ -49,7 +49,7 @@ provided - org.hibernate + org.hibernate.validator hibernate-validator-cdi ${hibernate-validator.version} @@ -115,7 +115,7 @@ 4.2.0.Final 2.1.2.Final 2.2 - 5.1.1.Final + 8.0.1.Final 4.1.0-RC3 4.0.4 8.0.8-dmr From f20a18ed9b97ead5c6f6e67f55993d3acc4c12dc Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 14 Nov 2023 10:28:22 +0100 Subject: [PATCH 531/831] clean, add mock example --- .../conditional/ConditionalTestConfig.java | 2 +- .../mockbean/MockBeanIntegrationTest.java | 4 +- .../profile/ProfileIntegrationMockTest.java | 38 +++++++++++++++++++ ...t.java => ProfileIntegrationStubTest.java} | 6 ++- .../profile/ProfileTestConfig.java | 12 +++++- 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java rename spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/{ProfileIntegrationTest.java => ProfileIntegrationStubTest.java} (84%) diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java index c48c4e2266..ce82b43df0 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/conditional/ConditionalTestConfig.java @@ -9,8 +9,8 @@ import com.baeldung.overridebean.Service; @TestConfiguration public class ConditionalTestConfig { - @ConditionalOnProperty(name = "service.stub", havingValue = "true") @Bean + @ConditionalOnProperty(name = "service.stub", havingValue = "true") public Service helloWorld() { return new ConditionalStub(); } diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java index 2ece28482d..9a63ad4113 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/mockbean/MockBeanIntegrationTest.java @@ -25,11 +25,11 @@ class MockBeanIntegrationTest { private MockMvc mockMvc; @MockBean - private Service serviceExample; + private Service service; @Test void givenServiceMockBean_whenGetHelloEndpoint_thenMockOk() throws Exception { - when(serviceExample.helloWorld()).thenReturn("hello mock bean"); + when(service.helloWorld()).thenReturn("hello mock bean"); this.mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string(containsString("hello mock bean"))); diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java new file mode 100644 index 0000000000..43fb69860d --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java @@ -0,0 +1,38 @@ +package com.baeldung.overridebean.profile; + +import static org.hamcrest.Matchers.containsString; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.overridebean.Endpoint; +import com.baeldung.overridebean.Service; +import com.baeldung.overridebean.boot.Application; + +@SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) +@AutoConfigureMockMvc +@ActiveProfiles("mock") +class ProfileIntegrationMockTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private Service service; + + @Test + void givenConfigurationWithProfile_whenTestProfileIsActive_thenMockOk() throws Exception { + when(service.helloWorld()).thenReturn("hello profile mock"); + this.mockMvc.perform(get("/hello")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("hello profile mock"))); + } +} diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java similarity index 84% rename from spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java index 7f4aae026c..e1c88f2a31 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import com.baeldung.overridebean.Endpoint; @@ -16,13 +17,14 @@ import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) @AutoConfigureMockMvc -class ProfileIntegrationTest { +@ActiveProfiles("stub") +class ProfileIntegrationStubTest { @Autowired private MockMvc mockMvc; @Test - void givenConfigurationWithProfile_whenNoProductionProfileIsActive_thenStubOk() throws Exception { + void givenConfigurationWithProfile_whenTestProfileIsActive_thenStubOk() throws Exception { this.mockMvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string(containsString("hello profile stub"))); diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java index edd33162e0..7e1de309d3 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileTestConfig.java @@ -1,7 +1,10 @@ package com.baeldung.overridebean.profile; +import static org.mockito.Mockito.mock; + import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; import com.baeldung.overridebean.Service; @@ -9,7 +12,14 @@ import com.baeldung.overridebean.Service; public class ProfileTestConfig { @Bean - public Service helloWorld() { + @Profile("stub") + public Service helloWorldStub() { return new ProfileServiceStub(); } + + @Bean + @Profile("mock") + public Service helloWorldMock() { + return mock(Service.class); + } } From 690f6edd5169c4bac54828d94c35be8aae417819 Mon Sep 17 00:00:00 2001 From: Ehsan Sasanianno Date: Tue, 14 Nov 2023 12:39:36 +0100 Subject: [PATCH 532/831] java-26772: upgrade jedis to 5.0.2 (#15207) --- persistence-modules/redis/pom.xml | 2 +- persistence-modules/spring-data-redis/pom.xml | 2 ++ spring-boot-modules/spring-boot-3-2/pom.xml | 2 ++ spring-web-modules/spring-session/spring-session-redis/pom.xml | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml index 571487af3d..98be674a8e 100644 --- a/persistence-modules/redis/pom.xml +++ b/persistence-modules/redis/pom.xml @@ -57,7 +57,7 @@ 0.6 3.20.0 - 4.3.2 + 5.0.2 4.1.90.Final diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index ab133192a0..052935e215 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -50,6 +50,7 @@ redis.clients jedis + ${jedis.version} jar @@ -83,6 +84,7 @@ 3.2.4 0.10.0 0.6 + 5.0.2 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index 9b5b7ea254..c85488d44b 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -135,6 +135,7 @@ redis.clients jedis + ${jedis.version} jar @@ -285,6 +286,7 @@ 3.0.0-M7 5.14.0 0.2.0 + 5.0.2 diff --git a/spring-web-modules/spring-session/spring-session-redis/pom.xml b/spring-web-modules/spring-session/spring-session-redis/pom.xml index 6824a3632d..6b1aec24e4 100644 --- a/spring-web-modules/spring-session/spring-session-redis/pom.xml +++ b/spring-web-modules/spring-session/spring-session-redis/pom.xml @@ -40,12 +40,14 @@ redis.clients jedis + ${jedis.version} jar 0.6 + 5.0.2 \ No newline at end of file From c6dbdeaaa5ecffef4bf18828a44d604255d9703e Mon Sep 17 00:00:00 2001 From: vunamtien Date: Tue, 14 Nov 2023 18:41:43 +0700 Subject: [PATCH 533/831] BAEL-7106-compress-and-uncompress-bytes (#15216) --- .../compressbytes/CompressByteArrayUtil.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java new file mode 100644 index 0000000000..88e2283985 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/compressbytes/CompressByteArrayUtil.java @@ -0,0 +1,58 @@ +package com.baeldung.compressbytes; + +import java.io.ByteArrayOutputStream; +import java.util.zip.DataFormatException; +import java.util.zip.Deflater; +import java.util.zip.Inflater; + +public class CompressByteArrayUtil { + + public static byte[] compress(byte[] input) { + Deflater deflater = new Deflater(); + deflater.setInput(input); + deflater.finish(); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + + while (!deflater.finished()) { + int compressedSize = deflater.deflate(buffer); + outputStream.write(buffer, 0, compressedSize); + } + + return outputStream.toByteArray(); + } + + public static byte[] decompress(byte[] input) throws DataFormatException { + Inflater inflater = new Inflater(); + inflater.setInput(input); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + + while (!inflater.finished()) { + int decompressedSize = inflater.inflate(buffer); + outputStream.write(buffer, 0, decompressedSize); + } + + return outputStream.toByteArray(); + } + + public static void main(String[] args) throws Exception { + String inputString = "Baeldung helps developers explore the Java ecosystem and simply be better engineers. " + + "We publish to-the-point guides and courses, with a strong focus on building web applications, Spring, " + + "Spring Security, and RESTful APIs"; + byte[] input = inputString.getBytes(); + + // Compression + byte[] compressedData = compress(input); + + // Decompression + byte[] decompressedData = decompress(compressedData); + + System.out.println("Original: " + input.length + " bytes"); + System.out.println("Compressed: " + compressedData.length + " bytes"); + System.out.println("Decompressed: " + decompressedData.length + " bytes"); + } + +} From 88926bba03b587cfbe8a7145e4246973a9d4a4f9 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Tue, 14 Nov 2023 22:21:47 +0100 Subject: [PATCH 534/831] [map-sort-by-value] add missing diamonds --- .../baeldung/map/LinkedHashMapSortByValueUnitTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java index 2508c1416d..8fd62cc20b 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LinkedHashMapSortByValueUnitTest.java @@ -55,7 +55,7 @@ class Player { } public class LinkedHashMapSortByValueUnitTest { - private static LinkedHashMap MY_MAP = new LinkedHashMap(); + private static LinkedHashMap MY_MAP = new LinkedHashMap<>(); static { MY_MAP.put("key a", 4); @@ -65,7 +65,7 @@ public class LinkedHashMapSortByValueUnitTest { MY_MAP.put("key e", 5); } - private static LinkedHashMap EXPECTED_MY_MAP = new LinkedHashMap(); + private static LinkedHashMap EXPECTED_MY_MAP = new LinkedHashMap<>(); static { EXPECTED_MY_MAP.put("key b", 1); @@ -75,8 +75,7 @@ public class LinkedHashMapSortByValueUnitTest { EXPECTED_MY_MAP.put("key e", 5); } - private static final LinkedHashMap PLAYERS = new LinkedHashMap(); - + private static final LinkedHashMap PLAYERS = new LinkedHashMap<>(); static { PLAYERS.put("player a", new Player("Eric", 9)); PLAYERS.put("player b", new Player("Kai", 7)); @@ -84,7 +83,7 @@ public class LinkedHashMapSortByValueUnitTest { PLAYERS.put("player d", new Player("Kevin", 4)); } - private static final LinkedHashMap EXPECTED_PLAYERS = new LinkedHashMap(); + private static final LinkedHashMap EXPECTED_PLAYERS = new LinkedHashMap<>(); static { EXPECTED_PLAYERS.put("player d", new Player("Kevin", 4)); From 2133e9b5db41efebdf7492f9ebd1672e8bdb42ba Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:48:17 +0100 Subject: [PATCH 535/831] BAEL-7176: How to avoid NoSuchElementException with Stream (#15098) --- .../NoSuchElementExceptionStreamUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/nosuchelementexception/NoSuchElementExceptionStreamUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/nosuchelementexception/NoSuchElementExceptionStreamUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/nosuchelementexception/NoSuchElementExceptionStreamUnitTest.java new file mode 100644 index 0000000000..bef834c1af --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/nosuchelementexception/NoSuchElementExceptionStreamUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.nosuchelementexception; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; + +import org.junit.Test; + +public class NoSuchElementExceptionStreamUnitTest { + + @Test(expected = NoSuchElementException.class) + public void givenEmptyOptional_whenCallingGetMethod_thenThrowNoSuchElementException() { + List names = List.of("William", "Amelia", "Albert", "Philip"); + Optional emptyOptional = names.stream() + .filter(name -> name.equals("Emma")) + .findFirst(); + + emptyOptional.get(); + } + + @Test + public void givenEmptyOptional_whenUsingIsPresentMethod_thenReturnDefault() { + List names = List.of("Tyler", "Amelia", "James", "Emma"); + Optional emptyOptional = names.stream() + .filter(name -> name.equals("Lucas")) + .findFirst(); + + String name = "unknown"; + if (emptyOptional.isPresent()) { + name = emptyOptional.get(); + } + + assertEquals("unknown", name); + } + + @Test + public void givenEmptyOptional_whenUsingOrElseMethod_thenReturnDefault() { + List names = List.of("Nicholas", "Justin", "James"); + Optional emptyOptional = names.stream() + .filter(name -> name.equals("Lucas")) + .findFirst(); + + String name = emptyOptional.orElse("unknown"); + + assertEquals("unknown", name); + } + + @Test + public void givenEmptyOptional_whenUsingOrElseGetMethod_thenReturnDefault() { + List names = List.of("Thomas", "Catherine", "David", "Olivia"); + Optional emptyOptional = names.stream() + .filter(name -> name.equals("Liam")) + .findFirst(); + + String name = emptyOptional.orElseGet(() -> "unknown"); + + assertEquals("unknown", name); + } + +} From 8a31837a3e9006aa2aea36f64a5bed17fe61e33e Mon Sep 17 00:00:00 2001 From: mcasari Date: Tue, 14 Nov 2023 23:22:44 +0100 Subject: [PATCH 536/831] BAEL-6600: fix flaws in the logic of put method --- .../com/baeldung/map/HashMapWithMaxSizeLimit.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java index 11845e6aa0..79c08dcb7c 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -11,17 +11,14 @@ public class HashMapWithMaxSizeLimit extends HashMap { public HashMapWithMaxSizeLimit(int maxSize) { super(); this.maxSize = maxSize; - } + } @Override public V put(K key, V value) { - V res = null; - if (this.maxSize == -1 || this.size() < this.maxSize) { - res = super.put(key, value); - } else if (this.maxSize != -1) { - throw new RuntimeException("Max size exceeded!"); - } - return res; + if (this.maxSize == -1 || this.containsKey(key) || this.size() < this.maxSize) { + return super.put(key, value); + } + throw new RuntimeException("Max size exceeded!"); } } From 6a7e63795d0f332c00eb2d06699da87dc94adca3 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 15 Nov 2023 11:15:27 +0530 Subject: [PATCH 537/831] BAEL-7091 removed Java 9 snippets --- testing-modules/testing-assertions/pom.xml | 12 ---- .../AssertNestedMapUnitTest.java | 68 ++++++++++++------- 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml index 1f2b4e335d..1da53bd77e 100644 --- a/testing-modules/testing-assertions/pom.xml +++ b/testing-modules/testing-assertions/pom.xml @@ -4,18 +4,6 @@ 4.0.0 testing-assertions 0.0.1-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 9 - 9 - - - - com.baeldung diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java index 7c48a5eb4a..ceef5efdd2 100644 --- a/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.assertnestedmap; import org.junit.jupiter.api.Test; +import java.util.HashMap; import java.util.Map; import static com.baeldung.assertnestedmap.matchers.NestedMapMatcher.hasNestedMapEntry; @@ -13,16 +14,22 @@ import static org.junit.jupiter.api.Assertions.*; public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseJupiterAssertTrueWithoutCasting_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map> outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + + Map> outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertTrue(outerMap.containsKey("address") && outerMap.get("address").get("city").equals("Chicago")); } @Test void givenNestedMap_whenUseJupiterAssertAllAndAssertTrue_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map> outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + + Map> outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertAll( () -> assertTrue(outerMap.containsKey("address")), @@ -32,8 +39,11 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseJupiterAssertTrueWithCasting_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + + Map outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertTrue(outerMap.containsKey("address") && ((Map)outerMap.get("address")).get("city").equals("Chicago")); @@ -41,8 +51,12 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseHamcrestAssertThat_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map> outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + + Map> outerMap = new HashMap<>(); + outerMap.put("address", innerMap); + assertAll( () -> assertThat(outerMap, hasKey("address")), () -> assertThat(outerMap.get("address"), hasEntry("city", "Chicago")) @@ -51,42 +65,46 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThat_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map> outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + + Map> outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertThat(outerMap, hasEntry(equalTo("address"), hasEntry("city", "Chicago"))); } @Test void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { - Map innerMap = Map.of - ( - "city", "Chicago", - "zip", "10005" - ); - Map> outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + innerMap.put("zip", "10005"); + + Map> outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertThat(outerMap, hasNestedMapEntry("address", innerMap)); } @Test void givenOuterMapOfStringAndObjectAndInnerMap_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { - Map innerMap = Map.of - ( - "city", "Chicago", - "zip", "10005" - ); - Map outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + innerMap.put("zip", "10005"); + + Map outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertThat(outerMap, hasNestedMapEntry("address", innerMap)); } @Test void givenNestedMap_whenUseHamcrestAssertThatWithCasting_thenTest() { - Map innerMap = Map.of("city", "Chicago"); - Map outerMap = Map.of("address", innerMap); + Map innerMap = new HashMap<>(); + innerMap.put("city", "Chicago"); + Map outerMap = new HashMap<>(); + outerMap.put("address", innerMap); assertThat((Map)outerMap.get("address"), hasEntry("city", "Chicago")); } - } From 7135047ba1ee35b1cec031a7e653fd68426a0806 Mon Sep 17 00:00:00 2001 From: maenolis Date: Wed, 15 Nov 2023 08:33:33 +0200 Subject: [PATCH 538/831] Initial commit for lazy lambda article --- core-java-modules/core-java-21/pom.xml | 13 +++++++-- .../baeldung/lazylambda/LambdaSupplier.java | 16 ++++++++++ .../lazylambda/LazyLambdaSupplier.java | 22 ++++++++++++++ .../LazyLambdaThreadSafeSupplier.java | 29 +++++++++++++++++++ .../lazylambda/LambdaSupplierUnitTest.java | 24 +++++++++++++++ .../LazyLambdaSupplierUnitTest.java | 23 +++++++++++++++ .../LazyLambdaThreadSafeSupplierUnitTest.java | 23 +++++++++++++++ 7 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java create mode 100644 core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml index bfe1cd2c78..98e73c89c0 100644 --- a/core-java-modules/core-java-21/pom.xml +++ b/core-java-modules/core-java-21/pom.xml @@ -22,9 +22,7 @@ 21 false - - --enable-preview - + --enable-preview @@ -38,6 +36,15 @@ + + + org.mockito + mockito-core + 5.7.0 + test + + + 21 21 diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java new file mode 100644 index 0000000000..a9c4c78edd --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java @@ -0,0 +1,16 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +public class LambdaSupplier { + + private final Supplier expensiveData; + + public LambdaSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + } + + public T getData() { + return expensiveData.get(); + } +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java new file mode 100644 index 0000000000..484fadbe90 --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java @@ -0,0 +1,22 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +public class LazyLambdaSupplier { + + private final Supplier expensiveData; + + private T data; + + public LazyLambdaSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + } + + public T getData() { + if (data != null) { + return data; + } + return data = expensiveData.get(); + } + +} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java new file mode 100644 index 0000000000..27180ced7d --- /dev/null +++ b/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java @@ -0,0 +1,29 @@ +package com.baeldung.lazylambda; + +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public class LazyLambdaThreadSafeSupplier { + + private final Supplier expensiveData; + + private final AtomicReference data; + + public LazyLambdaThreadSafeSupplier(Supplier expensiveData) { + this.expensiveData = expensiveData; + data = new AtomicReference<>(); + } + + public T getData() { + if (data.get() == null) { + synchronized (data) { + if (data.get() == null) { + data.set(expensiveData.get()); + } + } + } + + return data.get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java new file mode 100644 index 0000000000..b2d8b91043 --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() { + @SuppressWarnings("unchecked") + Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(4)).get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java new file mode 100644 index 0000000000..37464afe2e --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LazyLambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + } + +} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java new file mode 100644 index 0000000000..a67600c974 --- /dev/null +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.lazylambda; + +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; + +public class LazyLambdaThreadSafeSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + testee.getData(); + testee.getData(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + } + +} From 2ed78462c830a7560d8c748d661a3586178a5fb0 Mon Sep 17 00:00:00 2001 From: maenolis Date: Wed, 15 Nov 2023 08:36:28 +0200 Subject: [PATCH 539/831] Code formatting --- .../baeldung/lazylambda/LambdaSupplierUnitTest.java | 12 +++++++----- .../lazylambda/LazyLambdaSupplierUnitTest.java | 9 ++++++--- .../LazyLambdaThreadSafeSupplierUnitTest.java | 9 ++++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java index b2d8b91043..8b705286c2 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -9,16 +9,18 @@ public class LambdaSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledMultipleTimes() { - @SuppressWarnings("unchecked") - Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LambdaSupplier testee = new LambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(4)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(4)) + .get(); } } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java index 37464afe2e..4f110dfba7 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -10,14 +10,17 @@ public class LazyLambdaSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); } } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java index a67600c974..7870b5a111 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java +++ b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -10,14 +10,17 @@ public class LazyLambdaThreadSafeSupplierUnitTest { @Test public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()).thenReturn("expensive call"); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); testee.getData(); testee.getData(); testee.getData(); testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)).get(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); } } From 4d9a5ea8b46689b1c7f3a1f224a30c9207b431c5 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Wed, 15 Nov 2023 10:55:56 +0100 Subject: [PATCH 540/831] JAVA-12712 | intelliJ Module (#15152) --- intelliJ-modules/.gitignore | 1 + .../gradle/wrapper/gradle-wrapper.properties | 7 + intelliJ-modules/gradlew | 248 ++++++++++++++++++ intelliJ-modules/gradlew.bat | 92 +++++++ intelliJ-modules/settings.gradle | 3 + .../stackoverflow-plugin-gradle/build.gradle | 10 +- .../stackoverflow-plugin/build.gradle | 5 + .../stackoverflow-plugin/settings.gradle | 1 + 8 files changed, 363 insertions(+), 4 deletions(-) create mode 100644 intelliJ-modules/.gitignore create mode 100644 intelliJ-modules/gradle/wrapper/gradle-wrapper.properties create mode 100644 intelliJ-modules/gradlew create mode 100644 intelliJ-modules/gradlew.bat create mode 100644 intelliJ-modules/settings.gradle create mode 100644 intelliJ-modules/stackoverflow-plugin/build.gradle create mode 100644 intelliJ-modules/stackoverflow-plugin/settings.gradle diff --git a/intelliJ-modules/.gitignore b/intelliJ-modules/.gitignore new file mode 100644 index 0000000000..d16386367f --- /dev/null +++ b/intelliJ-modules/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/intelliJ-modules/gradle/wrapper/gradle-wrapper.properties b/intelliJ-modules/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..62f495dfed --- /dev/null +++ b/intelliJ-modules/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/intelliJ-modules/gradlew b/intelliJ-modules/gradlew new file mode 100644 index 0000000000..fcb6fca147 --- /dev/null +++ b/intelliJ-modules/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/intelliJ-modules/gradlew.bat b/intelliJ-modules/gradlew.bat new file mode 100644 index 0000000000..93e3f59f13 --- /dev/null +++ b/intelliJ-modules/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/intelliJ-modules/settings.gradle b/intelliJ-modules/settings.gradle new file mode 100644 index 0000000000..ff10e09b3c --- /dev/null +++ b/intelliJ-modules/settings.gradle @@ -0,0 +1,3 @@ +rootProject.name = 'intellij-modules' +include 'stackoverflow-plugin' +include 'stackoverflow-plugin-gradle' diff --git a/intelliJ-modules/stackoverflow-plugin-gradle/build.gradle b/intelliJ-modules/stackoverflow-plugin-gradle/build.gradle index cd0cc258bf..3967a1f075 100644 --- a/intelliJ-modules/stackoverflow-plugin-gradle/build.gradle +++ b/intelliJ-modules/stackoverflow-plugin-gradle/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.jetbrains.intellij' version '0.4.21' + id 'org.jetbrains.intellij' version '1.16.0' } group 'com.baeldung' @@ -11,15 +11,17 @@ repositories { } dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' + testImplementation('junit:junit:4.12') } // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { - version '2020.1.1' + version = "2022.2.5" + type = "IC" } + patchPluginXml { - changeNotes """ + changeNotes = """ Add change notes here.
most HTML tags may be used""" } \ No newline at end of file diff --git a/intelliJ-modules/stackoverflow-plugin/build.gradle b/intelliJ-modules/stackoverflow-plugin/build.gradle new file mode 100644 index 0000000000..81962e0e0a --- /dev/null +++ b/intelliJ-modules/stackoverflow-plugin/build.gradle @@ -0,0 +1,5 @@ +// this project is not supposed to be built. We check only if it compiles fine. + +plugins { + id 'java' +} \ No newline at end of file diff --git a/intelliJ-modules/stackoverflow-plugin/settings.gradle b/intelliJ-modules/stackoverflow-plugin/settings.gradle new file mode 100644 index 0000000000..4ebea35284 --- /dev/null +++ b/intelliJ-modules/stackoverflow-plugin/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'stackoverflow-plugin' From de50130c7461ddb7c12ee4b5832eb4244f852c1d Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Wed, 15 Nov 2023 14:30:00 +0100 Subject: [PATCH 541/831] Create Table using ASCII in a Console in Java (#15158) --- core-java-modules/core-java-console/pom.xml | 6 ++ .../consoletableoutput/BodyMassIndex.java | 44 +++++++++++++ .../BodyMassIndexApplication.java | 62 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndex.java create mode 100644 core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndexApplication.java diff --git a/core-java-modules/core-java-console/pom.xml b/core-java-modules/core-java-console/pom.xml index 1b56f1f27c..8677b672ea 100644 --- a/core-java-modules/core-java-console/pom.xml +++ b/core-java-modules/core-java-console/pom.xml @@ -29,6 +29,11 @@ + + de.vandermeer + asciitable + ${ascii.version} + @@ -157,6 +162,7 @@ 3.0.0-M1 1.8 1.8 + 0.3.2
\ No newline at end of file diff --git a/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndex.java b/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndex.java new file mode 100644 index 0000000000..96cede7020 --- /dev/null +++ b/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndex.java @@ -0,0 +1,44 @@ +package com.baeldung.consoletableoutput; + +public class BodyMassIndex { + + private String name; + private double height; + private double weight; + + public BodyMassIndex(String name, double height, double weight) { + this.name = name; + this.height = height; + this.weight = weight; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getHeight() { + return height; + } + + public void setHeight(double height) { + this.height = height; + } + + public double getWeight() { + return weight; + } + + public void setWeight(double weight) { + this.weight = weight; + } + + public double calculate() { + double bmi = weight / (height * height); + String formattedBmi = String.format("%.2f", bmi); + return Double.parseDouble(formattedBmi); + } +} diff --git a/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndexApplication.java b/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndexApplication.java new file mode 100644 index 0000000000..cb340256aa --- /dev/null +++ b/core-java-modules/core-java-console/src/main/java/com/baeldung/consoletableoutput/BodyMassIndexApplication.java @@ -0,0 +1,62 @@ +package com.baeldung.consoletableoutput; + +import java.util.ArrayList; +import java.util.List; + +import de.vandermeer.asciitable.AsciiTable; +import de.vandermeer.skb.interfaces.transformers.textformat.TextAlignment; + +public class BodyMassIndexApplication { + + public static void main(String[] args) { + stringFormat(); + asciiTable(); + + } + + public static void stringFormat() { + List bodyMassIndices = new ArrayList<>(); + bodyMassIndices.add(new BodyMassIndex("Tom", 1.8, 80)); + bodyMassIndices.add(new BodyMassIndex("Elton", 1.9, 90)); + bodyMassIndices.add(new BodyMassIndex("Harry", 1.9, 90)); + bodyMassIndices.add(new BodyMassIndex("Hannah", 1.9, 90)); + + String leftAlignment = "| %-7s | %-7.2f | %-7.2f | %-5.2f |%n"; + + System.out.format("+---------+---------+---------+-------+%n"); + System.out.format("| Name | Height | Weight | BMI |%n"); + System.out.format("+---------+---------+---------+-------+%n"); + + for (BodyMassIndex bodyMassIndex : bodyMassIndices) { + System.out.format(leftAlignment, bodyMassIndex.getName(), bodyMassIndex.getHeight(), bodyMassIndex.getWeight(), bodyMassIndex.calculate()); + System.out.format("+---------+---------+---------+-------+%n"); + } + + } + + public static void asciiTable() { + List bodyMassIndices = new ArrayList<>(); + bodyMassIndices.add(new BodyMassIndex("Tom", 1.8, 80)); + bodyMassIndices.add(new BodyMassIndex("Elton", 1.9, 90)); + bodyMassIndices.add(new BodyMassIndex("Harry", 1.9, 90)); + bodyMassIndices.add(new BodyMassIndex("Hannah", 1.9, 90)); + + AsciiTable asciiTable = new AsciiTable(); + asciiTable.addRule(); + asciiTable.addRow("Name", "Height", "Weight", "BMI"); + asciiTable.addRule(); + + for (BodyMassIndex bodyMassIndex : bodyMassIndices) { + + asciiTable.addRow(bodyMassIndex.getName(), bodyMassIndex.getHeight(), bodyMassIndex.getWeight(), bodyMassIndex.calculate()); + asciiTable.addRule(); + + } + + asciiTable.setTextAlignment(TextAlignment.CENTER); + String render = asciiTable.render(); + System.out.println(render); + + } + +} From 5787183a36f8a30196f5630f4b702010db1b0042 Mon Sep 17 00:00:00 2001 From: Wynn Teo <49014791+wynnteo@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:55:03 +0800 Subject: [PATCH 542/831] BAEL-7109 - added code to demostrate how to get max date in java (#14944) * BAEL-7109 - added code to demostrate how to get max date in java * BAEL-7109 Fix test case typo * BAEL-7109 Fix test case file name * Fix the test method * Fix the test method * Fix the test method * Remove public * add new line --- .../com/baeldung/maxdate/DateComparison.java | 18 ++++++++++++++++++ .../com/baeldung/maxdate/MaxDateDisplay.java | 18 ++++++++++++++++++ .../maxdate/DateComparisonUnitTest.java | 16 ++++++++++++++++ .../maxdate/MaxDateDisplayUnitTest.java | 18 ++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/DateComparison.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/MaxDateDisplay.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/DateComparisonUnitTest.java create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/MaxDateDisplayUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/DateComparison.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/DateComparison.java new file mode 100644 index 0000000000..d6450670a2 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/DateComparison.java @@ -0,0 +1,18 @@ +package com.baeldung.maxdate; + +import java.util.Date; + +public class DateComparison { + public int compareTodayWithMaxDate() { + Date today = new Date(); + Date maxDate = new Date(Long.MAX_VALUE); + + int comparisonResult = today.compareTo(maxDate); + return comparisonResult; + } + + public static void main(String[] args) { + DateComparison comparator = new DateComparison(); + System.out.println(comparator.compareTodayWithMaxDate()); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/MaxDateDisplay.java b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/MaxDateDisplay.java new file mode 100644 index 0000000000..b79b5f4422 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/main/java/com/baeldung/maxdate/MaxDateDisplay.java @@ -0,0 +1,18 @@ +package com.baeldung.maxdate; + +import java.util.Date; +import java.text.SimpleDateFormat; + +public class MaxDateDisplay { + public String getMaxDateValue() { + Date maxDate = new Date(Long.MAX_VALUE); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + return "The maximum date value in Java is: " + sdf.format(maxDate); + } + + public static void main(String[] args) { + MaxDateDisplay display = new MaxDateDisplay(); + System.out.println(display.getMaxDateValue()); + } +} + diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/DateComparisonUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/DateComparisonUnitTest.java new file mode 100644 index 0000000000..70aef126da --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/DateComparisonUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.maxdate; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class DateComparisonUnitTest { + + @Test + void whenCompareTodayWithMaxDate_thenCorrectResult() { + DateComparison comparator = new DateComparison(); + int result = comparator.compareTodayWithMaxDate(); + + assertTrue(result < 0); + } +} diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/MaxDateDisplayUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/MaxDateDisplayUnitTest.java new file mode 100644 index 0000000000..dd7000bd29 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/maxdate/MaxDateDisplayUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.maxdate; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class MaxDateDisplayUnitTest { + + @Test + void whenGetMaxDate_thenCorrectResult() { + MaxDateDisplay display = new MaxDateDisplay(); + String result = display.getMaxDateValue(); + assertEquals( + "The maximum date value in Java is: 292278994-08-17 07:12:55.807", + result + ); + } +} From 0838279c6afa9bf92a2a89cdb2edcafaddd1a039 Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:16:28 +0100 Subject: [PATCH 543/831] BAEL-7092: How to get the size of a file in MB, KB & GB in java (#15117) * BAEL-7092: How to get the size of a file in MB, KB & GB in java * Update JavaFileSizeUnitTest.java * BAEL-7092: How to get the size of a file in MB, KB & GB in java --------- Co-authored-by: Grzegorz Piwowarek --- .../java/com/baeldung/size/FileSizeUtils.java | 28 +++++++++++++++++ .../baeldung/size/JavaFileSizeUnitTest.java | 31 ++++++++++++++++--- 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 core-java-modules/core-java-io/src/main/java/com/baeldung/size/FileSizeUtils.java diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/size/FileSizeUtils.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/size/FileSizeUtils.java new file mode 100644 index 0000000000..18c8687043 --- /dev/null +++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/size/FileSizeUtils.java @@ -0,0 +1,28 @@ +package com.baeldung.size; + +import java.io.File; + +public class FileSizeUtils { + public static long getFileSizeInBytes(File file) { + if (file.exists()) { + return file.length(); + } else { + throw new IllegalArgumentException("File not found."); + } + } + + public static double getFileSizeInKilobytes(File file) { + long bytes = getFileSizeInBytes(file); + return (double) bytes / 1024; + } + + public static double getFileSizeInMegabytes(File file) { + double kilobytes = getFileSizeInKilobytes(file); + return kilobytes / 1024; + } + + public static double getFileSizeInGigabytes(File file) { + double megabytes = getFileSizeInMegabytes(file); + return megabytes / 1024; + } +} diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java index d015f2602e..d8f4361260 100644 --- a/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java +++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.size; -import static org.junit.Assert.assertEquals; +import org.apache.commons.io.FileUtils; +import org.junit.Before; +import org.junit.Test; import java.io.File; import java.io.FileInputStream; @@ -10,9 +12,9 @@ import java.net.URL; import java.nio.channels.FileChannel; import java.nio.file.Path; import java.nio.file.Paths; -import org.apache.commons.io.FileUtils; -import org.junit.Before; -import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; public class JavaFileSizeUnitTest { private static final long EXPECTED_FILE_SIZE_IN_BYTES = 11; @@ -85,4 +87,23 @@ public class JavaFileSizeUnitTest { assertEquals(EXPECTED_FILE_SIZE_IN_BYTES, stream.available()); } } -} \ No newline at end of file + + @Test + public void whenGetFileSizeInDifferentUnits_thenCorrect(){ + filePath = String.join(File.separator, new String[] { "src", "test", "resources", "size", "sample_file_1.in" }); + File file = new File(filePath); + if (file.exists()) { + long expectedBytes = file.length(); + double expectedKilobytes = (double) expectedBytes / 1024; + double expectedMegabytes = expectedKilobytes / 1024; + double expectedGigabytes = expectedMegabytes / 1024; + + assertEquals(expectedBytes, FileSizeUtils.getFileSizeInBytes(file)); + assertEquals(expectedKilobytes, FileSizeUtils.getFileSizeInKilobytes(file), 0.01); + assertEquals(expectedMegabytes, FileSizeUtils.getFileSizeInMegabytes(file), 0.01); + assertEquals(expectedGigabytes, FileSizeUtils.getFileSizeInGigabytes(file), 0.01); + } else { + fail("File not found."); + } + } +} From 5942a934cf5d78e0b363e8625dc4a7fd140b8c8e Mon Sep 17 00:00:00 2001 From: macasari Date: Wed, 15 Nov 2023 23:53:42 +0100 Subject: [PATCH 544/831] BAEL-6600: add further test cases --- .../baeldung/map/HashMapWithMaxSizeLimit.java | 8 +++- ...MaxSizeHashMapByCustomHashMapUnitTest.java | 41 +++++++++++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java index 79c08dcb7c..517dac6362 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -7,17 +7,21 @@ public class HashMapWithMaxSizeLimit extends HashMap { private static final long serialVersionUID = 1L; private int maxSize = -1; + + public HashMapWithMaxSizeLimit() { + super(); + } public HashMapWithMaxSizeLimit(int maxSize) { super(); this.maxSize = maxSize; - } + } @Override public V put(K key, V value) { if (this.maxSize == -1 || this.containsKey(key) || this.size() < this.maxSize) { return super.put(key, value); - } + } throw new RuntimeException("Max size exceeded!"); } diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java index 09b2e2122a..0846baae1a 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java @@ -1,9 +1,9 @@ package com.baeldung.map; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class LimitMaxSizeHashMapByCustomHashMapUnitTest { @@ -11,24 +11,49 @@ class LimitMaxSizeHashMapByCustomHashMapUnitTest { private final int MAX_SIZE = 4; private HashMapWithMaxSizeLimit hashMapWithMaxSizeLimit; - @BeforeEach - void setUp() { - hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + @Test + void givenCustomHashMapObject_whenThereIsNoLimit_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(); + assertDoesNotThrow(() -> { + for (int i = 0; i < 10000; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } + }); } @Test - void givenCustomHashMapObject_whenAddingNewEntryAndLimitExceeded_thenThrowsException() { - Exception exception = assertThrows(RuntimeException.class, () -> { + void givenCustomHashMapObject_whenLimitNotReached_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + assertDoesNotThrow(() -> { + for (int i = 0; i < 4; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } + }); + } + + @Test + void givenCustomHashMapObject_whenReplacingValueWhenLimitIsReached_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + assertDoesNotThrow(() -> { hashMapWithMaxSizeLimit.put(1, "One"); hashMapWithMaxSizeLimit.put(2, "Two"); hashMapWithMaxSizeLimit.put(3, "Three"); hashMapWithMaxSizeLimit.put(4, "Four"); - hashMapWithMaxSizeLimit.put(5, "Five"); + hashMapWithMaxSizeLimit.put(4, "4"); + }); + } + + @Test + void givenCustomHashMapObject_whenLimitExceeded_thenThrowsException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + Exception exception = assertThrows(RuntimeException.class, () -> { + for (int i = 0; i < 5; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } }); String messageThrownWhenSizeExceedsLimit = "Max size exceeded!"; String actualMessage = exception.getMessage(); - assertTrue(actualMessage.equals(messageThrownWhenSizeExceedsLimit)); } From 336ee922eb0933fef3f6ab6b554f4cc07f2f652d Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 16 Nov 2023 12:21:18 +0200 Subject: [PATCH 545/831] JAVA-26692 Go over tutorials - integration builds test results - Week 45 - 2023 (#15194) Co-authored-by: timis1 --- .../multipletopics/KafkaMultipleTopicsIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multipletopics/KafkaMultipleTopicsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multipletopics/KafkaMultipleTopicsIntegrationTest.java index 345e84b65b..570670cdf9 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multipletopics/KafkaMultipleTopicsIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/multipletopics/KafkaMultipleTopicsIntegrationTest.java @@ -21,7 +21,7 @@ import org.springframework.kafka.test.context.EmbeddedKafka; import org.springframework.kafka.test.utils.ContainerTestUtils; @SpringBootTest(classes = KafkaMultipleTopicsApplication.class) -@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +@EmbeddedKafka(partitions = 1, brokerProperties = { "listeners=PLAINTEXT://localhost:9099", "port=9099" }) public class KafkaMultipleTopicsIntegrationTest { private static final String CARD_PAYMENTS_TOPIC = "card-payments"; private static final String BANK_TRANSFERS_TOPIC = "bank-transfers"; From f12328011b0a0c254b5096c3ce0dbfd7dcbd4c7f Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 16 Nov 2023 20:10:00 +0530 Subject: [PATCH 546/831] BAEL-7091 reverted Java 9 snippets --- .../AssertNestedMapUnitTest.java | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java index ceef5efdd2..7c48a5eb4a 100644 --- a/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java +++ b/testing-modules/testing-assertions/src/test/java/com/baeldung/assertnestedmap/AssertNestedMapUnitTest.java @@ -3,7 +3,6 @@ package com.baeldung.assertnestedmap; import org.junit.jupiter.api.Test; -import java.util.HashMap; import java.util.Map; import static com.baeldung.assertnestedmap.matchers.NestedMapMatcher.hasNestedMapEntry; @@ -14,22 +13,16 @@ import static org.junit.jupiter.api.Assertions.*; public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseJupiterAssertTrueWithoutCasting_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - - Map> outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); assertTrue(outerMap.containsKey("address") && outerMap.get("address").get("city").equals("Chicago")); } @Test void givenNestedMap_whenUseJupiterAssertAllAndAssertTrue_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - - Map> outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); assertAll( () -> assertTrue(outerMap.containsKey("address")), @@ -39,11 +32,8 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseJupiterAssertTrueWithCasting_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - - Map outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of("city", "Chicago"); + Map outerMap = Map.of("address", innerMap); assertTrue(outerMap.containsKey("address") && ((Map)outerMap.get("address")).get("city").equals("Chicago")); @@ -51,12 +41,8 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMap_whenUseHamcrestAssertThat_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - - Map> outerMap = new HashMap<>(); - outerMap.put("address", innerMap); - + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); assertAll( () -> assertThat(outerMap, hasKey("address")), () -> assertThat(outerMap.get("address"), hasEntry("city", "Chicago")) @@ -65,46 +51,42 @@ public class AssertNestedMapUnitTest { @Test void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThat_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - - Map> outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of("city", "Chicago"); + Map> outerMap = Map.of("address", innerMap); assertThat(outerMap, hasEntry(equalTo("address"), hasEntry("city", "Chicago"))); } @Test void givenNestedMapOfStringAndObject_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - innerMap.put("zip", "10005"); - - Map> outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of + ( + "city", "Chicago", + "zip", "10005" + ); + Map> outerMap = Map.of("address", innerMap); assertThat(outerMap, hasNestedMapEntry("address", innerMap)); } @Test void givenOuterMapOfStringAndObjectAndInnerMap_whenUseHamcrestAssertThatAndCustomMatcher_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - innerMap.put("zip", "10005"); - - Map outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of + ( + "city", "Chicago", + "zip", "10005" + ); + Map outerMap = Map.of("address", innerMap); assertThat(outerMap, hasNestedMapEntry("address", innerMap)); } @Test void givenNestedMap_whenUseHamcrestAssertThatWithCasting_thenTest() { - Map innerMap = new HashMap<>(); - innerMap.put("city", "Chicago"); - Map outerMap = new HashMap<>(); - outerMap.put("address", innerMap); + Map innerMap = Map.of("city", "Chicago"); + Map outerMap = Map.of("address", innerMap); assertThat((Map)outerMap.get("address"), hasEntry("city", "Chicago")); } + } From 58db4f7a091f29128ddbbacc99ccecec46a2c422 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 16 Nov 2023 20:22:43 +0100 Subject: [PATCH 547/831] JAVA-27338: Fix VehicleUnitTest --- .../com/baeldung/sealed/classes/VehicleUnitTest.java | 8 ++++---- .../com/baeldung/sealed/records/VehicleUnitTest.java | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-17/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 index 73d8aad810..0c437affd8 100644 --- a/core-java-modules/core-java-17/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 @@ -18,19 +18,19 @@ public class VehicleUnitTest { } @Test - public void givenCar_whenUsingReflectionAPI_thenSuperClassIsSealed() { + public void givenCar_whenUsingReflectionAPI_thenSuperClassIsSealed() throws ClassNotFoundException { Assertions.assertThat(car.getClass().isSealed()).isEqualTo(false); Assertions.assertThat(car.getClass().getSuperclass().isSealed()).isEqualTo(true); Assertions.assertThat(car.getClass().getSuperclass().getPermittedSubclasses()) - .contains(ClassDesc.of(car.getClass().getCanonicalName())); + .contains(Class.forName(car.getClass().getCanonicalName())); } @Test - public void givenTruck_whenUsingReflectionAPI_thenSuperClassIsSealed() { + public void givenTruck_whenUsingReflectionAPI_thenSuperClassIsSealed() throws ClassNotFoundException { Assertions.assertThat(truck.getClass().isSealed()).isEqualTo(false); Assertions.assertThat(truck.getClass().getSuperclass().isSealed()).isEqualTo(true); Assertions.assertThat(truck.getClass().getSuperclass().getPermittedSubclasses()) - .contains(ClassDesc.of(truck.getClass().getCanonicalName())); + .contains(Class.forName(truck.getClass().getCanonicalName())); } @Test diff --git a/core-java-modules/core-java-17/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 index ac8a8c953c..8dd150b5e7 100644 --- a/core-java-modules/core-java-17/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 @@ -18,19 +18,19 @@ public class VehicleUnitTest { } @Test - public void givenCar_whenUsingReflectionAPI_thenInterfaceIsSealed() { + public void givenCar_whenUsingReflectionAPI_thenInterfaceIsSealed() throws ClassNotFoundException { Assertions.assertThat(car.getClass().isSealed()).isEqualTo(false); Assertions.assertThat(car.getClass().getInterfaces()[0].isSealed()).isEqualTo(true); - Assertions.assertThat(car.getClass().getInterfaces()[0].permittedSubclasses()) - .contains(ClassDesc.of(car.getClass().getCanonicalName())); + Assertions.assertThat(car.getClass().getInterfaces()[0].getPermittedSubclasses()) + .contains(Class.forName(car.getClass().getCanonicalName())); } @Test - public void givenTruck_whenUsingReflectionAPI_thenInterfaceIsSealed() { + public void givenTruck_whenUsingReflectionAPI_thenInterfaceIsSealed() throws ClassNotFoundException { Assertions.assertThat(truck.getClass().isSealed()).isEqualTo(false); Assertions.assertThat(truck.getClass().getInterfaces()[0].isSealed()).isEqualTo(true); - Assertions.assertThat(truck.getClass().getInterfaces()[0].permittedSubclasses()) - .contains(ClassDesc.of(truck.getClass().getCanonicalName())); + Assertions.assertThat(truck.getClass().getInterfaces()[0].getPermittedSubclasses()) + .contains(Class.forName(truck.getClass().getCanonicalName())); } @Test From 0b229a9af4cc321f4bebb278d47616f726c7cb48 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Thu, 16 Nov 2023 18:35:11 -0300 Subject: [PATCH 548/831] draft 1 (#15222) --- ...tSpecificDeserializationFilterFactory.java | 47 +++++++ .../pojo/ContextSpecific.java | 7 ++ .../pojo/NestedSample.java | 19 +++ .../deserializationfilters/pojo/Sample.java | 61 +++++++++ .../pojo/SampleExploit.java | 25 ++++ .../service/DeserializationService.java | 11 ++ .../service/LimitedArrayService.java | 15 +++ .../service/LowDepthService.java | 20 +++ .../service/SmallObjectService.java | 15 +++ .../utils/DeserializationUtils.java | 50 ++++++++ .../utils/FilterUtils.java | 32 +++++ .../utils/SerializationUtils.java | 17 +++ ...cDeserializationFilterIntegrationTest.java | 119 ++++++++++++++++++ 13 files changed, 438 insertions(+) create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterFactory.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/ContextSpecific.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/NestedSample.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/Sample.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/SampleExploit.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/DeserializationService.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LimitedArrayService.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LowDepthService.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/SmallObjectService.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/DeserializationUtils.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/FilterUtils.java create mode 100644 core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/SerializationUtils.java create mode 100644 core-java-modules/core-java-17/src/test/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterIntegrationTest.java diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterFactory.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterFactory.java new file mode 100644 index 0000000000..25a855487e --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterFactory.java @@ -0,0 +1,47 @@ +package com.baeldung.deserializationfilters; + +import java.io.ObjectInputFilter; +import java.util.function.BinaryOperator; + +import com.baeldung.deserializationfilters.service.DeserializationService; +import com.baeldung.deserializationfilters.service.LimitedArrayService; +import com.baeldung.deserializationfilters.service.LowDepthService; +import com.baeldung.deserializationfilters.service.SmallObjectService; +import com.baeldung.deserializationfilters.utils.FilterUtils; + +public class ContextSpecificDeserializationFilterFactory implements BinaryOperator { + + @Override + public ObjectInputFilter apply(ObjectInputFilter current, ObjectInputFilter next) { + if (current == null) { + Class caller = findInStack(DeserializationService.class); + + if (caller == null) { + current = FilterUtils.fallbackFilter(); + } else if (caller.equals(SmallObjectService.class)) { + current = FilterUtils.safeSizeFilter(190); + } else if (caller.equals(LowDepthService.class)) { + current = FilterUtils.safeDepthFilter(2); + } else if (caller.equals(LimitedArrayService.class)) { + current = FilterUtils.safeArrayFilter(3); + } + } + + return ObjectInputFilter.merge(current, next); + } + + private static Class findInStack(Class superType) { + for (StackTraceElement element : Thread.currentThread() + .getStackTrace()) { + try { + Class subType = Class.forName(element.getClassName()); + if (superType.isAssignableFrom(subType)) { + return subType; + } + } catch (ClassNotFoundException e) { + return null; + } + } + return null; + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/ContextSpecific.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/ContextSpecific.java new file mode 100644 index 0000000000..add827d280 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/ContextSpecific.java @@ -0,0 +1,7 @@ +package com.baeldung.deserializationfilters.pojo; + +import java.io.Serializable; + +public interface ContextSpecific extends Serializable { + +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/NestedSample.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/NestedSample.java new file mode 100644 index 0000000000..a1d41744e6 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/NestedSample.java @@ -0,0 +1,19 @@ +package com.baeldung.deserializationfilters.pojo; + +public class NestedSample implements ContextSpecific { + private static final long serialVersionUID = 1L; + + private Sample optional; + + public NestedSample(Sample optional) { + this.optional = optional; + } + + public Sample getOptional() { + return optional; + } + + public void setOptional(Sample optional) { + this.optional = optional; + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/Sample.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/Sample.java new file mode 100644 index 0000000000..fed3639c64 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/Sample.java @@ -0,0 +1,61 @@ +package com.baeldung.deserializationfilters.pojo; + +public class Sample implements ContextSpecific, Comparable { + private static final long serialVersionUID = 1L; + + private int[] array; + private String name; + private NestedSample nested; + + public Sample(String name) { + this.name = name; + } + + public Sample(int[] array) { + this.array = array; + } + + public Sample(NestedSample nested) { + this.nested = nested; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int[] getArray() { + return array; + } + + public void setArray(int[] array) { + this.array = array; + } + + public NestedSample getNested() { + return nested; + } + + public void setNested(NestedSample nested) { + this.nested = nested; + } + + @Override + public String toString() { + return name; + } + + @Override + public int compareTo(Sample o) { + if (name == null) + return -1; + + if (o == null || o.getName() == null) + return 1; + + return getName().compareTo(o.getName()); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/SampleExploit.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/SampleExploit.java new file mode 100644 index 0000000000..24dce289c6 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/pojo/SampleExploit.java @@ -0,0 +1,25 @@ +package com.baeldung.deserializationfilters.pojo; + +public class SampleExploit extends Sample { + private static final long serialVersionUID = 1L; + + public SampleExploit() { + super("exploit"); + } + + public static void maliciousCode() { + System.out.println("exploit executed"); + } + + @Override + public String toString() { + maliciousCode(); + return "exploit"; + } + + @Override + public int compareTo(Sample o) { + maliciousCode(); + return super.compareTo(o); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/DeserializationService.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/DeserializationService.java new file mode 100644 index 0000000000..9a66cb0e91 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/DeserializationService.java @@ -0,0 +1,11 @@ +package com.baeldung.deserializationfilters.service; + +import java.io.InputStream; +import java.util.Set; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; + +public interface DeserializationService { + + Set process(InputStream... inputStreams); +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LimitedArrayService.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LimitedArrayService.java new file mode 100644 index 0000000000..3aadbe7111 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LimitedArrayService.java @@ -0,0 +1,15 @@ +package com.baeldung.deserializationfilters.service; + +import java.io.InputStream; +import java.util.Set; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; +import com.baeldung.deserializationfilters.utils.DeserializationUtils; + +public class LimitedArrayService implements DeserializationService { + + @Override + public Set process(InputStream... inputStreams) { + return DeserializationUtils.deserializeIntoSet(inputStreams); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LowDepthService.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LowDepthService.java new file mode 100644 index 0000000000..69350c1399 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/LowDepthService.java @@ -0,0 +1,20 @@ +package com.baeldung.deserializationfilters.service; + +import java.io.InputStream; +import java.io.ObjectInputFilter; +import java.util.Set; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; +import com.baeldung.deserializationfilters.utils.DeserializationUtils; + +public class LowDepthService implements DeserializationService { + + public Set process(ObjectInputFilter filter, InputStream... inputStreams) { + return DeserializationUtils.deserializeIntoSet(filter, inputStreams); + } + + @Override + public Set process(InputStream... inputStreams) { + return process(null, inputStreams); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/SmallObjectService.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/SmallObjectService.java new file mode 100644 index 0000000000..a0690276b7 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/service/SmallObjectService.java @@ -0,0 +1,15 @@ +package com.baeldung.deserializationfilters.service; + +import java.io.InputStream; +import java.util.Set; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; +import com.baeldung.deserializationfilters.utils.DeserializationUtils; + +public class SmallObjectService implements DeserializationService { + + @Override + public Set process(InputStream... inputStreams) { + return DeserializationUtils.deserializeIntoSet(inputStreams); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/DeserializationUtils.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/DeserializationUtils.java new file mode 100644 index 0000000000..54db823102 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/DeserializationUtils.java @@ -0,0 +1,50 @@ +package com.baeldung.deserializationfilters.utils; + +import java.io.InputStream; +import java.io.InvalidClassException; +import java.io.ObjectInputFilter; +import java.io.ObjectInputStream; +import java.util.Set; +import java.util.TreeSet; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; + +public class DeserializationUtils { + private DeserializationUtils() { + } + + public static Object deserialize(InputStream inStream) { + return deserialize(inStream, null); + } + + public static Object deserialize(InputStream inStream, ObjectInputFilter filter) { + try (ObjectInputStream in = new ObjectInputStream(inStream)) { + if (filter != null) { + in.setObjectInputFilter(filter); + } + return in.readObject(); + } catch (InvalidClassException e) { + return null; + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + } + + public static Set deserializeIntoSet(InputStream... inputStreams) { + return deserializeIntoSet(null, inputStreams); + } + + public static Set deserializeIntoSet(ObjectInputFilter filter, InputStream... inputStreams) { + Set set = new TreeSet<>(); + + for (InputStream inputStream : inputStreams) { + Object object = deserialize(inputStream, filter); + if (object != null) { + set.add((ContextSpecific) object); + } + } + + return set; + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/FilterUtils.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/FilterUtils.java new file mode 100644 index 0000000000..fac69a94b9 --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/FilterUtils.java @@ -0,0 +1,32 @@ +package com.baeldung.deserializationfilters.utils; + +import java.io.ObjectInputFilter; + +public class FilterUtils { + + private static final String DEFAULT_PACKAGE_PATTERN = "java.base/*;!*"; + private static final String POJO_PACKAGE = "com.baeldung.deserializationfilters.pojo"; + + private FilterUtils() { + } + + private static ObjectInputFilter baseFilter(String parameter, int max) { + return ObjectInputFilter.Config.createFilter(String.format("%s=%d;%s.**;%s", parameter, max, POJO_PACKAGE, DEFAULT_PACKAGE_PATTERN)); + } + + public static ObjectInputFilter fallbackFilter() { + return ObjectInputFilter.Config.createFilter(String.format("%s", DEFAULT_PACKAGE_PATTERN)); + } + + public static ObjectInputFilter safeSizeFilter(int max) { + return baseFilter("maxbytes", max); + } + + public static ObjectInputFilter safeArrayFilter(int max) { + return baseFilter("maxarray", max); + } + + public static ObjectInputFilter safeDepthFilter(int max) { + return baseFilter("maxdepth", max); + } +} diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/SerializationUtils.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/SerializationUtils.java new file mode 100644 index 0000000000..4f62e5d46b --- /dev/null +++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/deserializationfilters/utils/SerializationUtils.java @@ -0,0 +1,17 @@ +package com.baeldung.deserializationfilters.utils; + +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.OutputStream; + +public class SerializationUtils { + + private SerializationUtils() { + } + + public static void serialize(Object object, OutputStream outStream) throws IOException { + try (ObjectOutputStream objStream = new ObjectOutputStream(outStream)) { + objStream.writeObject(object); + } + } +} diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterIntegrationTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterIntegrationTest.java new file mode 100644 index 0000000000..3e7de20070 --- /dev/null +++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/deserializationfilters/ContextSpecificDeserializationFilterIntegrationTest.java @@ -0,0 +1,119 @@ +package com.baeldung.deserializationfilters; + +import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputFilter; +import java.util.Set; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import com.baeldung.deserializationfilters.pojo.ContextSpecific; +import com.baeldung.deserializationfilters.pojo.NestedSample; +import com.baeldung.deserializationfilters.pojo.Sample; +import com.baeldung.deserializationfilters.pojo.SampleExploit; +import com.baeldung.deserializationfilters.service.LimitedArrayService; +import com.baeldung.deserializationfilters.service.LowDepthService; +import com.baeldung.deserializationfilters.service.SmallObjectService; +import com.baeldung.deserializationfilters.utils.DeserializationUtils; +import com.baeldung.deserializationfilters.utils.FilterUtils; +import com.baeldung.deserializationfilters.utils.SerializationUtils; + +public class ContextSpecificDeserializationFilterIntegrationTest { + + private static ByteArrayOutputStream serialSampleA = new ByteArrayOutputStream(); + private static ByteArrayOutputStream serialBigSampleA = new ByteArrayOutputStream(); + + private static ByteArrayOutputStream serialSampleB = new ByteArrayOutputStream(); + private static ByteArrayOutputStream serialBigSampleB = new ByteArrayOutputStream(); + + private static ByteArrayOutputStream serialSampleC = new ByteArrayOutputStream(); + private static ByteArrayOutputStream serialBigSampleC = new ByteArrayOutputStream(); + + private static ByteArrayInputStream bytes(ByteArrayOutputStream stream) { + return new ByteArrayInputStream(stream.toByteArray()); + } + + @BeforeAll + static void setup() throws IOException { + ObjectInputFilter.Config.setSerialFilterFactory(new ContextSpecificDeserializationFilterFactory()); + + SerializationUtils.serialize(new Sample("simple"), serialSampleA); + SerializationUtils.serialize(new SampleExploit(), serialBigSampleA); + + SerializationUtils.serialize(new Sample(new int[] { 1, 2, 3 }), serialSampleB); + SerializationUtils.serialize(new Sample(new int[] { 1, 2, 3, 4, 5, 6 }), serialBigSampleB); + + SerializationUtils.serialize(new Sample(new NestedSample(null)), serialSampleC); + SerializationUtils.serialize(new Sample(new NestedSample(new Sample("deep"))), serialBigSampleC); + } + + @Test + void whenSmallObjectContext_thenCorrectFilterApplied() { + Set result = new SmallObjectService().process( // + bytes(serialSampleA), // + bytes(serialBigSampleA)); + + assertEquals(1, result.size()); + assertEquals("simple", ((Sample) result.iterator() + .next()).getName()); + } + + @Test + void whenLimitedArrayContext_thenCorrectFilterApplied() { + Set result = new LimitedArrayService().process( // + bytes(serialSampleB), // + bytes(serialBigSampleB)); + + assertEquals(1, result.size()); + } + + @Test + void whenLowDepthContext_thenCorrectFilterApplied() { + Set result = new LowDepthService().process( // + bytes(serialSampleC), // + bytes(serialBigSampleC)); + + assertEquals(1, result.size()); + } + + @Test + void givenExtraFilter_whenCombinedContext_thenMergedFiltersApplied() { + Set result = new LowDepthService().process( // + FilterUtils.safeSizeFilter(190), // + bytes(serialSampleA), // + bytes(serialBigSampleA), // + bytes(serialSampleC), // + bytes(serialBigSampleC)); + + assertEquals(1, result.size()); + assertEquals("simple", ((Sample) result.iterator() + .next()).getName()); + } + + @Test + void givenFallbackContext_whenUsingBaseClasses_thenRestrictiveFilterApplied() throws IOException { + String a = new String("a"); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + SerializationUtils.serialize(a, outStream); + + String deserializedA = (String) DeserializationUtils.deserialize(bytes(outStream)); + + assertEquals(a, deserializedA); + } + + @Test + void givenFallbackContext_whenUsingAppClasses_thenRejected() throws IOException { + Sample a = new Sample("a"); + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + SerializationUtils.serialize(a, outStream); + + Sample deserializedA = (Sample) DeserializationUtils.deserialize(bytes(outStream)); + + assertNull(deserializedA); + } +} From 290147ff08d2d194a8a054a98301f51dc069f3a6 Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Fri, 17 Nov 2023 00:27:43 +0200 Subject: [PATCH 549/831] This PR is related to BAEL-7181 (#15230) * Update TimestampToLongUnitTest.java * Update TimestampToLong.java --- .../timestamptolong/TimestampToLong.java | 31 +++++++-------- .../TimestampToLongUnitTest.java | 39 +++++++------------ 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java index 2ebe30f4ff..25a8a57ba7 100644 --- a/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java +++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/timestamptolong/TimestampToLong.java @@ -1,32 +1,31 @@ package com.baeldung.timestamptolong; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Date; public class TimestampToLong { - public void usingSimpleDateFormat() throws ParseException { + + public long usingSimpleDateFormat(String timestampString) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String currentDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - long actualTimestamp = sdf.parse(currentDateString).getTime(); + Date date = sdf.parse(timestampString); + String currentDateString = sdf.format(date); + return sdf.parse(currentDateString).getTime(); } - public void usingInstantClass() { - Instant instant = Instant.now(); - long actualTimestamp = instant.toEpochMilli(); + public long usingInstantClass(String timestampString) { + Instant instant = LocalDateTime.parse(timestampString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + .atZone(ZoneId.systemDefault()) + .toInstant(); + return instant.toEpochMilli(); } - public void usingTimestamp() { - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - long actualTimestamp = timestamp.getTime(); + public long usingJava8DateTime(String timestampString) { + LocalDateTime localDateTime = LocalDateTime.parse(timestampString.replace(" ", "T")); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); } - - public void usingJava8DateTime() { - LocalDateTime localDateTime = LocalDateTime.now(); - long actualTimestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - } -} \ No newline at end of file +} diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java index ede8f7792d..868d019cf2 100644 --- a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolong/TimestampToLongUnitTest.java @@ -2,51 +2,42 @@ package com.baeldung.timestamptolong; import org.junit.Test; -import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Date; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; public class TimestampToLongUnitTest { - - private static final long TOLERANCE = 1000; + private static final String timestampString = "2023-11-15 01:02:03"; @Test - public void givenSimpleDateFormat_whenFormattingDate_thenTConvertToLong() throws ParseException { + public void givenSimpleDateFormat_whenFormattingDate_thenConvertToLong() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = sdf.parse(timestampString); - String currentDateString = sdf.format(new Date()); + String currentDateString = sdf.format(date); long actualTimestamp = sdf.parse(currentDateString).getTime(); - - assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + assertEquals(1700010123000L, actualTimestamp); } @Test - public void givenInstantClass_whenGettingTimestamp_thenTConvertToLong() { - Instant instant = Instant.now(); + public void givenInstantClass_whenGettingTimestamp_thenConvertToLong() { + Instant instant = LocalDateTime.parse(timestampString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + .atZone(ZoneId.systemDefault()) + .toInstant(); long actualTimestamp = instant.toEpochMilli(); - - assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + assertEquals(1700010123000L, actualTimestamp); } @Test - public void givenTimestamp_whenCreatingTimestamp_thenTConvertToLong() { - Timestamp timestamp = new Timestamp(System.currentTimeMillis()); - long actualTimestamp = timestamp.getTime(); - - assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); - } - - @Test - public void givenJava8DateTime_whenGettingTimestamp_thenTConvertToLong() { - LocalDateTime localDateTime = LocalDateTime.now(); + public void givenJava8DateTime_whenGettingTimestamp_thenConvertToLong() { + LocalDateTime localDateTime = LocalDateTime.parse(timestampString.replace(" ", "T")); long actualTimestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); - - assertTrue(Math.abs(System.currentTimeMillis() - actualTimestamp) < TOLERANCE); + assertEquals(1700010123000L, actualTimestamp); } } From 9d441e11b8d53128f733643e3333809564ac6268 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:47:49 +0200 Subject: [PATCH 550/831] This commit is related to the article BAEL-7172 (#15232) This commit aims to add two classes that provide insights about the time complexity of Collections.sort(). --- .../CollectionsSortTimeComplexityJMH.java | 60 +++++++++++++++++++ .../CollectionsSortTimeComplexityMain.java | 33 ++++++++++ 2 files changed, 93 insertions(+) create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityJMH.java create mode 100644 core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityMain.java diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityJMH.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityJMH.java new file mode 100644 index 0000000000..766a89f674 --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityJMH.java @@ -0,0 +1,60 @@ +package com.baeldung.collectionssortcomplexity; + +import org.openjdk.jmh.annotations.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Fork(value = 1, warmups = 1) +@Warmup(iterations = 5, time = 1) +@Measurement(iterations = 5, time = 1) +public class CollectionsSortTimeComplexityJMH { + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + + } + + @Benchmark + public void measureCollectionsSortBestCase(BestCaseBenchmarkState state) { + List sortedList = new ArrayList<>(state.sortedList); + Collections.sort(sortedList); + } + + @Benchmark + public void measureCollectionsSortAverageWorstCase(AverageWorstCaseBenchmarkState state) { + List unsortedList = new ArrayList<>(state.unsortedList); + Collections.sort(unsortedList); + } + + @State(Scope.Benchmark) + public static class BestCaseBenchmarkState { + List sortedList; + + @Setup(Level.Trial) + public void setUp() { + sortedList = new ArrayList<>(); + for (int i = 1; i <= 1000000; i++) { + sortedList.add(i); + } + } + } + + @State(Scope.Benchmark) + public static class AverageWorstCaseBenchmarkState { + List unsortedList; + + @Setup(Level.Trial) + public void setUp() { + unsortedList = new ArrayList<>(); + for (int i = 1000000; i > 0; i--) { + unsortedList.add(i); + } + } + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityMain.java b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityMain.java new file mode 100644 index 0000000000..f273d3562a --- /dev/null +++ b/core-java-modules/core-java-collections-5/src/main/java/com/baeldung/collectionssortcomplexity/CollectionsSortTimeComplexityMain.java @@ -0,0 +1,33 @@ +package com.baeldung.collectionssortcomplexity; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CollectionsSortTimeComplexityMain { + // O(n log n) Time Complexity Example + public static void worstAndAverageCasesTimeComplexity() { + Integer[] sortedArray = {20, 21, 22, 23, 24, 25, 26, 17, 28, 29, 30, 31, 18, 19, 32, 33, 34, 27, 35}; + List list = Arrays.asList(sortedArray); + Collections.shuffle(list); + long startTime = System.nanoTime(); + Collections.sort(list); + long endTime = System.nanoTime(); + System.out.println("Execution Time for O(n log n): " + (endTime - startTime) + " nanoseconds"); + } + + // O(n) Time Complexity Example + public static void bestCaseTimeComplexity() { + Integer[] sortedArray = {19, 22, 19, 22, 24, 25, 17, 11, 22, 23, 28, 23, 0, 1, 12, 9, 13, 27, 15}; + List list = Arrays.asList(sortedArray); + long startTime = System.nanoTime(); + Collections.sort(list); + long endTime = System.nanoTime(); + System.out.println("Execution Time for O(n): " + (endTime - startTime) + " nanoseconds"); + } + + public static void main(String[] args) { + worstAndAverageCasesTimeComplexity(); + bestCaseTimeComplexity(); + } +} From 97557d4fa5774d44606b6cfeef658da8f95a8818 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 17 Nov 2023 05:05:02 +0000 Subject: [PATCH 551/831] Gradle Proxy Configuration --- .../gradle-proxy-configuration/.gitignore | 42 ++++ .../gradle-proxy-configuration/build.gradle | 20 ++ .../gradle.properties | 12 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../gradle-proxy-configuration/gradlew | 234 ++++++++++++++++++ .../gradle-proxy-configuration/gradlew.bat | 89 +++++++ .../settings.gradle | 2 + gradle-modules/settings.gradle | 2 +- 9 files changed, 406 insertions(+), 1 deletion(-) create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/.gitignore create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/build.gradle create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/gradle.properties create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/gradle/wrapper/gradle-wrapper.properties create mode 100755 gradle-modules/gradle-7/gradle-proxy-configuration/gradlew create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/gradlew.bat create mode 100644 gradle-modules/gradle-7/gradle-proxy-configuration/settings.gradle diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/.gitignore b/gradle-modules/gradle-7/gradle-proxy-configuration/.gitignore new file mode 100644 index 0000000000..b63da4551b --- /dev/null +++ b/gradle-modules/gradle-7/gradle-proxy-configuration/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/build.gradle b/gradle-modules/gradle-7/gradle-proxy-configuration/build.gradle new file mode 100644 index 0000000000..7463486961 --- /dev/null +++ b/gradle-modules/gradle-7/gradle-proxy-configuration/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' +} + +group = 'org.baeldung' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' + implementation 'io.micrometer:micrometer-core:1.12.0' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/gradle.properties b/gradle-modules/gradle-7/gradle-proxy-configuration/gradle.properties new file mode 100644 index 0000000000..207872023f --- /dev/null +++ b/gradle-modules/gradle-7/gradle-proxy-configuration/gradle.properties @@ -0,0 +1,12 @@ +# HTTP proxy settings +systemProp.http.proxyHost=localhost +systemProp.http.proxyPort=3128 +systemProp.http.proxyUser=USER +systemProp.http.proxyPassword=PASSWORD +systemProp.http.nonProxyHosts=*.nonproxyrepos.com +# HTTPS proxy settings +systemProp.https.proxyHost=localhost +systemProp.https.proxyPort=3128 +systemProp.https.proxyUser=USER +systemProp.https.proxyPassword=PASSWORD +systemProp.https.nonProxyHosts=*.nonproxyrepos.com \ No newline at end of file diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/gradle-proxy-configuration/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/gradlew.bat b/gradle-modules/gradle-7/gradle-proxy-configuration/gradlew.bat new file mode 100644 index 0000000000..ac1b06f938 --- /dev/null +++ b/gradle-modules/gradle-7/gradle-proxy-configuration/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle-modules/gradle-7/gradle-proxy-configuration/settings.gradle b/gradle-modules/gradle-7/gradle-proxy-configuration/settings.gradle new file mode 100644 index 0000000000..02edde146a --- /dev/null +++ b/gradle-modules/gradle-7/gradle-proxy-configuration/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'gradle-proxy-configuration' + diff --git a/gradle-modules/settings.gradle b/gradle-modules/settings.gradle index 34dbd0cf53..0833a9758f 100644 --- a/gradle-modules/settings.gradle +++ b/gradle-modules/settings.gradle @@ -2,4 +2,4 @@ rootProject.name = 'gradle-modules' include 'gradle' include 'gradle-5' include 'gradle-6' -include 'gradle-7' +include 'gradle-7' \ No newline at end of file From e5215678f385ee012464311a3064835c70129325 Mon Sep 17 00:00:00 2001 From: timis1 Date: Thu, 16 Nov 2023 09:17:03 +0200 Subject: [PATCH 552/831] JAVA-27449 Fix test in libraries-data-io module --- .../com/baeldung/libraries/opencsv/OpenCsvIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7cfe8984e7..6745b9be7f 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 @@ -74,7 +74,7 @@ public class OpenCsvIntegrationTest { assertThat(contents.split(NEW_LINE)) .containsExactly( - "'colA','colB','colC'", + "'COLA','COLB','COLC'", "'Test1','sample','data'", "'Test2','ipso','facto'" ); From 7f88b9748e82bd6b51f37ae9bfb6981a062a9b98 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Fri, 17 Nov 2023 21:24:13 +0100 Subject: [PATCH 553/831] Update and rename ProfileIntegrationStubTest.java to ProfileStubIntegrationTest.java Satisfy test naming convention --- ...IntegrationStubTest.java => ProfileStubIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/{ProfileIntegrationStubTest.java => ProfileStubIntegrationTest.java} (97%) diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileStubIntegrationTest.java similarity index 97% rename from spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileStubIntegrationTest.java index e1c88f2a31..2d6eb06d32 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationStubTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileStubIntegrationTest.java @@ -18,7 +18,7 @@ import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) @AutoConfigureMockMvc @ActiveProfiles("stub") -class ProfileIntegrationStubTest { +class ProfileStubIntegrationTest { @Autowired private MockMvc mockMvc; From 92ef912fcf29b2fd755560dad3fdcdf67a89fb59 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Fri, 17 Nov 2023 21:24:57 +0100 Subject: [PATCH 554/831] Update and rename ProfileIntegrationMockTest.java to ProfileMockIntegrationTest.java Satisfy naming convention --- ...IntegrationMockTest.java => ProfileMockIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/{ProfileIntegrationMockTest.java => ProfileMockIntegrationTest.java} (97%) diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileMockIntegrationTest.java similarity index 97% rename from spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileMockIntegrationTest.java index 43fb69860d..2fac6d954a 100644 --- a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileIntegrationMockTest.java +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/overridebean/profile/ProfileMockIntegrationTest.java @@ -20,7 +20,7 @@ import com.baeldung.overridebean.boot.Application; @SpringBootTest(classes = { Application.class, ProfileConfig.class, Endpoint.class, ProfileTestConfig.class }) @AutoConfigureMockMvc @ActiveProfiles("mock") -class ProfileIntegrationMockTest { +class ProfileMockIntegrationTest { @Autowired private MockMvc mockMvc; From 6cbd1b5b5229d8839b265f41590580570e56f94b Mon Sep 17 00:00:00 2001 From: mikr Date: Fri, 17 Nov 2023 21:32:43 +0100 Subject: [PATCH 555/831] Update readme --- spring-boot-modules/spring-boot-testing-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-testing-2/README.md b/spring-boot-modules/spring-boot-testing-2/README.md index 1baf83bf34..fbf708381b 100644 --- a/spring-boot-modules/spring-boot-testing-2/README.md +++ b/spring-boot-modules/spring-boot-testing-2/README.md @@ -14,4 +14,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Boot – Testing Redis With Testcontainers](https://www.baeldung.com/spring-boot-redis-testcontainers) - [Spring Boot – Keycloak Integration Testing with Testcontainers](https://www.baeldung.com/spring-boot-keycloak-integration-testing) - [Difference Between @Spy and @SpyBean](https://www.baeldung.com/spring-spy-vs-spybean) +- [Overriding Spring Beans in Integration Test](https://www.baeldung.com/overriding-spring-beans-in-integration-test) - More articles: [[<-- prev]](../spring-boot-testing) From 62c3d6bf328220c3bf66828cd71eeb3f9e71d845 Mon Sep 17 00:00:00 2001 From: maenolis Date: Fri, 17 Nov 2023 22:44:42 +0200 Subject: [PATCH 556/831] Moved to core-java-function module Added concurrent tests --- .../LazyLambdaSupplierUnitTest.java | 26 ---------- .../LazyLambdaThreadSafeSupplierUnitTest.java | 26 ---------- .../baeldung/lazylambda/LambdaSupplier.java | 2 +- .../lazylambda/LazyLambdaSupplier.java | 7 ++- .../LazyLambdaThreadSafeSupplier.java | 7 +-- .../lazylambda/LambdaSupplierUnitTest.java | 4 +- .../LazyLambdaSupplierUnitTest.java | 51 ++++++++++++++++++ .../LazyLambdaThreadSafeSupplierUnitTest.java | 52 +++++++++++++++++++ 8 files changed, 110 insertions(+), 65 deletions(-) delete mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java delete mode 100644 core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java (85%) rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java (70%) rename core-java-modules/{core-java-21 => core-java-function}/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java (79%) rename core-java-modules/{core-java-21 => core-java-function}/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java (85%) create mode 100644 core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java create mode 100644 core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java deleted file mode 100644 index 4f110dfba7..0000000000 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.lazylambda; - -import java.util.function.Supplier; - -import org.junit.Test; -import org.mockito.Mockito; - -public class LazyLambdaSupplierUnitTest { - - @Test - public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { - @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()) - .thenReturn("expensive call"); - LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()) - .get(); - testee.getData(); - testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) - .get(); - } - -} diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java deleted file mode 100644 index 7870b5a111..0000000000 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.lazylambda; - -import java.util.function.Supplier; - -import org.junit.Test; -import org.mockito.Mockito; - -public class LazyLambdaThreadSafeSupplierUnitTest { - - @Test - public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { - @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); - Mockito.when(mockedExpensiveFunction.get()) - .thenReturn("expensive call"); - LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); - Mockito.verify(mockedExpensiveFunction, Mockito.never()) - .get(); - testee.getData(); - testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) - .get(); - } - -} diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java similarity index 85% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java index a9c4c78edd..36cd1b31ae 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LambdaSupplier.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; public class LambdaSupplier { - private final Supplier expensiveData; + protected final Supplier expensiveData; public LambdaSupplier(Supplier expensiveData) { this.expensiveData = expensiveData; diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java similarity index 70% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java index 484fadbe90..dce3cc4997 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaSupplier.java @@ -2,16 +2,15 @@ package com.baeldung.lazylambda; import java.util.function.Supplier; -public class LazyLambdaSupplier { - - private final Supplier expensiveData; +public class LazyLambdaSupplier extends LambdaSupplier { private T data; public LazyLambdaSupplier(Supplier expensiveData) { - this.expensiveData = expensiveData; + super(expensiveData); } + @Override public T getData() { if (data != null) { return data; diff --git a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java similarity index 79% rename from core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java rename to core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java index 27180ced7d..32eec0a5d8 100644 --- a/core-java-modules/core-java-21/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java +++ b/core-java-modules/core-java-function/src/main/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplier.java @@ -3,14 +3,12 @@ package com.baeldung.lazylambda; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; -public class LazyLambdaThreadSafeSupplier { - - private final Supplier expensiveData; +public class LazyLambdaThreadSafeSupplier extends LambdaSupplier { private final AtomicReference data; public LazyLambdaThreadSafeSupplier(Supplier expensiveData) { - this.expensiveData = expensiveData; + super(expensiveData); data = new AtomicReference<>(); } @@ -22,7 +20,6 @@ public class LazyLambdaThreadSafeSupplier { } } } - return data.get(); } diff --git a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java similarity index 85% rename from core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java rename to core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java index 8b705286c2..f0a500e084 100644 --- a/core-java-modules/core-java-21/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LambdaSupplierUnitTest.java @@ -17,9 +17,7 @@ public class LambdaSupplierUnitTest { .get(); testee.getData(); testee.getData(); - testee.getData(); - testee.getData(); - Mockito.verify(mockedExpensiveFunction, Mockito.times(4)) + Mockito.verify(mockedExpensiveFunction, Mockito.times(2)) .get(); } diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java new file mode 100644 index 0000000000..1371983a3d --- /dev/null +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaSupplierUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.lazylambda; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; + +public class LazyLambdaSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + + @Test + public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledMultipleTimes() throws InterruptedException { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenAnswer((Answer) invocation -> { + Thread.sleep(1000L); + return "Late response!"; + }); + LazyLambdaSupplier testee = new LazyLambdaSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + + ExecutorService executorService = Executors.newFixedThreadPool(4); + executorService.invokeAll(List.of(testee::getData, testee::getData)); + executorService.shutdown(); + if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + + Mockito.verify(mockedExpensiveFunction, Mockito.times(2)) + .get(); + } +} diff --git a/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java new file mode 100644 index 0000000000..83bd49aa7e --- /dev/null +++ b/core-java-modules/core-java-function/src/test/java/com/baeldung/lazylambda/LazyLambdaThreadSafeSupplierUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.lazylambda; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; + +public class LazyLambdaThreadSafeSupplierUnitTest { + + @Test + public void whenCalledMultipleTimes_thenShouldBeCalledOnlyOnce() { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenReturn("expensive call"); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + testee.getData(); + testee.getData(); + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + + @Test + public void whenCalledMultipleTimesConcurrently_thenShouldBeCalledOnlyOnce() throws InterruptedException { + @SuppressWarnings("unchecked") Supplier mockedExpensiveFunction = Mockito.mock(Supplier.class); + Mockito.when(mockedExpensiveFunction.get()) + .thenAnswer((Answer) invocation -> { + Thread.sleep(1000L); + return "Late response!"; + }); + LazyLambdaThreadSafeSupplier testee = new LazyLambdaThreadSafeSupplier<>(mockedExpensiveFunction); + Mockito.verify(mockedExpensiveFunction, Mockito.never()) + .get(); + + ExecutorService executorService = Executors.newFixedThreadPool(4); + executorService.invokeAll(List.of(testee::getData, testee::getData)); + executorService.shutdown(); + if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + + Mockito.verify(mockedExpensiveFunction, Mockito.times(1)) + .get(); + } + +} From 0c8b5bd210b716979891651a7af36582987c6183 Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Sat, 18 Nov 2023 06:09:14 +0700 Subject: [PATCH 557/831] retry with colision --- .../baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 70b47df163..27ac4fe51e 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -56,6 +56,13 @@ public class UUIDPositiveLongGeneratorUnitTest { } + private boolean isUnique(long value) { + // Implementasikan logika pengecekan keunikan, misalnya, dengan memeriksa dalam database + // Mengembalikan true jika nilai unik, false jika ada tumbukan + return true; // Implementasikan sesuai kebutuhan aplikasi Anda + } + + private String convertMillisToTime(long currentTimeMillis) { long totalMilliseconds = currentTimeMillis % 1000; From f90651c5f9619f156c5d04b0018a815a64d5b04e Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 18 Nov 2023 12:34:13 +0530 Subject: [PATCH 558/831] BAEL-7200 Modify Request Body Before Reaching Controller in Spring Boot --- spring-boot-modules/spring-boot-mvc-5/pom.xml | 12 +++ .../modifyrequest/ModifyRequestApp.java | 11 +++ .../modifyrequest/aop/EscapeHtmlAspect.java | 74 +++++++++++++++++++ .../config/WebMvcConfiguration.java | 25 +++++++ .../controller/UserController.java | 23 ++++++ .../filter/EscapeHtmlFilter.java | 27 +++++++ .../EscapeHtmlRequestInterceptor.java | 19 +++++ .../EscapeHtmlRequestWrapper.java | 68 +++++++++++++++++ .../modifyrequest/filter-sequence-design.puml | 31 ++++++++ .../interceptor-sequence-design.puml | 33 +++++++++ .../EscapeHtmlAspectIntegrationTest.java | 52 +++++++++++++ .../EscapeHtmlFilterIntegrationTest.java | 51 +++++++++++++ .../EscapeHtmlInterceptorIntegrationTest.java | 46 ++++++++++++ 13 files changed, 472 insertions(+) create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/ModifyRequestApp.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/controller/UserController.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/filter/EscapeHtmlFilter.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/interceptor/EscapeHtmlRequestInterceptor.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/filter-sequence-design.puml create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/interceptor-sequence-design.puml create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-mvc-5/pom.xml b/spring-boot-modules/spring-boot-mvc-5/pom.xml index a516cab049..10a58a6a59 100644 --- a/spring-boot-modules/spring-boot-mvc-5/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-5/pom.xml @@ -49,6 +49,10 @@ commons-configuration ${commons-configuration.version} + + org.springframework.boot + spring-boot-starter-aop + @@ -61,6 +65,14 @@ JAR + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/ModifyRequestApp.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/ModifyRequestApp.java new file mode 100644 index 0000000000..7dd937d5b8 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/ModifyRequestApp.java @@ -0,0 +1,11 @@ +package com.baeldung.modifyrequest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung.modifyrequest") +public class ModifyRequestApp { + public static void main(String[] args) { + SpringApplication.run(ModifyRequestApp.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java new file mode 100644 index 0000000000..fb31abe11b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java @@ -0,0 +1,74 @@ +package com.baeldung.modifyrequest.aop; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; + +import java.io.*; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; + +@RestControllerAdvice +@Profile("aspectExample") +public class EscapeHtmlAspect implements RequestBodyAdvice { + private static final Logger logger = LoggerFactory.getLogger(EscapeHtmlAspect.class); + + @Override + public boolean supports(MethodParameter methodParameter, Type targetType, Class> converterType) { + //Apply this to all Controllers + return true; + } + + @Override + public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) throws IOException { + logger.info("beforeBodyRead called"); + InputStream inputStream = inputMessage.getBody(); + return new HttpInputMessage() { + @Override + public InputStream getBody() throws IOException { + return new ByteArrayInputStream(escapeHtml(inputStream).getBytes(StandardCharsets.UTF_8)); + } + + @Override + public HttpHeaders getHeaders() { + return inputMessage.getHeaders(); + } + }; + } + + @Override + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + // Return the modified object after reading the body + return body; + } + + @Override + public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + //return the original body + return body; + } + + private String escapeHtml(InputStream inputStream) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try (inputStream) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } + String input = stringBuilder.toString(); + // Escape HTML characters + return input.replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">"); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java new file mode 100644 index 0000000000..bd76fd5e55 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java @@ -0,0 +1,25 @@ +package com.baeldung.modifyrequest.config; + +import com.baeldung.modifyrequest.interceptor.EscapeHtmlRequestInterceptor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Profile("interceptorExample") +public class WebMvcConfiguration implements WebMvcConfigurer { + private static final Logger logger = LoggerFactory.getLogger(WebMvcConfiguration.class); + + @Override + public void addInterceptors(InterceptorRegistry registry) { + logger.info("addInterceptors() called"); + registry.addInterceptor(new EscapeHtmlRequestInterceptor()) + .addPathPatterns("/save"); + + WebMvcConfigurer.super.addInterceptors(registry); + } +} + diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/controller/UserController.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/controller/UserController.java new file mode 100644 index 0000000000..26450dd70d --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/controller/UserController.java @@ -0,0 +1,23 @@ +package com.baeldung.modifyrequest.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/") +public class UserController { + Logger logger = LoggerFactory.getLogger(UserController.class); + + @PostMapping(value = "save") + public ResponseEntity saveUser(@RequestBody String user) { + logger.info("save user info into database"); + ResponseEntity responseEntity = new ResponseEntity<>(user, HttpStatus.CREATED); + return responseEntity; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/filter/EscapeHtmlFilter.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/filter/EscapeHtmlFilter.java new file mode 100644 index 0000000000..45cad3be1c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/filter/EscapeHtmlFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.modifyrequest.filter; + +import com.baeldung.modifyrequest.requestwrapper.EscapeHtmlRequestWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; + +@Component +@Order(1) +@Profile("filterExample") +public class EscapeHtmlFilter implements Filter { + Logger logger = LoggerFactory.getLogger(EscapeHtmlFilter.class); + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + logger.info("Modify the request"); + + filterChain.doFilter(new EscapeHtmlRequestWrapper((HttpServletRequest) servletRequest), servletResponse); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/interceptor/EscapeHtmlRequestInterceptor.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/interceptor/EscapeHtmlRequestInterceptor.java new file mode 100644 index 0000000000..1ad39605e5 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/interceptor/EscapeHtmlRequestInterceptor.java @@ -0,0 +1,19 @@ +package com.baeldung.modifyrequest.interceptor; + +import com.baeldung.modifyrequest.requestwrapper.EscapeHtmlRequestWrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class EscapeHtmlRequestInterceptor implements HandlerInterceptor { + private static final Logger logger = LoggerFactory.getLogger(EscapeHtmlRequestInterceptor.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + EscapeHtmlRequestWrapper escapeHtmlRequestWrapper = new EscapeHtmlRequestWrapper(request); + return true; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java new file mode 100644 index 0000000000..65c758d956 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java @@ -0,0 +1,68 @@ +package com.baeldung.modifyrequest.requestwrapper; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.*; + +public class EscapeHtmlRequestWrapper extends HttpServletRequestWrapper { + private String body = null; + public EscapeHtmlRequestWrapper(HttpServletRequest request) throws IOException { + super(request); + this.body = this.escapeHtml(request); + } + + private String escapeHtml(HttpServletRequest request) throws IOException { + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try (InputStream inputStream = request.getInputStream()) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } + String input = stringBuilder.toString(); + // Escape HTML characters + return input.replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + //.replaceAll("\"", """) + .replaceAll("'", "'"); + } + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + + @Override + public int read() { + return byteArrayInputStream.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener listener) { + + } + }; + return servletInputStream; + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/filter-sequence-design.puml b/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/filter-sequence-design.puml new file mode 100644 index 0000000000..41689ac723 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/filter-sequence-design.puml @@ -0,0 +1,31 @@ +@startuml +'https://plantuml.com/sequence-diagram +skinparam sequenceMessageAlign direction +skinparam handwritten true +skinparam sequence { +ParticipantBackgroundColor beige +ParticipantPadding 50 +} + +autonumber + +Browser -[#63b175]> Filter: HTTP Request +activate Browser +activate Filter +Filter -[#63b175]> Filter: doFilter() +Filter -[#63b175]> DispatcherServlet: HTTP Request +activate DispatcherServlet + + +DispatcherServlet -[#63b175]> Controller: HTTP Request +activate Controller +Controller --[#63b175]> DispatcherServlet: HTTP Response +deactivate Controller + +DispatcherServlet --[#63b175]> Filter: HTTP Response +deactivate DispatcherServlet + +Filter --[#63b175]> Browser: HTTP Response +deactivate Filter +deactivate Browser +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/interceptor-sequence-design.puml b/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/interceptor-sequence-design.puml new file mode 100644 index 0000000000..429b8182ca --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/resources/modifyrequest/interceptor-sequence-design.puml @@ -0,0 +1,33 @@ +@startuml +'https://plantuml.com/sequence-diagram +skinparam sequenceMessageAlign direction +skinparam handwritten true +skinparam sequence { +ParticipantBackgroundColor beige +ParticipantPadding 50 +} + +autonumber + +Browser -[#63b175]> Filter: Http Request +activate Browser +activate Filter +Filter -[#63b175]> DispatcherServlet: Http Request +activate DispatcherServlet + +DispatcherServlet -[#63b175]> Interceptor: Http Request +activate Interceptor +Interceptor -[#63b175]> Interceptor: preHandle() +Interceptor -[#63b175]> Controller: Http Request +activate Controller +Controller --[#63b175]> Interceptor: Http Response +deactivate Controller +Interceptor --[#63b175]> DispatcherServlet: Http Response +deactivate Interceptor +DispatcherServlet --[#63b175]> Filter: Http Response +deactivate DispatcherServlet + +Filter --[#63b175]> Browser: Http Response +deactivate Filter +deactivate Browser +@enduml \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java new file mode 100644 index 0000000000..665733c61b --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.modifyrequest; + +import com.baeldung.modifyrequest.controller.UserController; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.net.URI; +import java.util.Map; + +@ExtendWith(SpringExtension.class) +@AutoConfigureMockMvc +@WebMvcTest(UserController.class) +@ActiveProfiles("aspectExample") +public class EscapeHtmlAspectIntegrationTest { + Logger logger = LoggerFactory.getLogger(EscapeHtmlAspectIntegrationTest.class); + + @Autowired + private MockMvc mockMvc; + @Test + void givenAspect_whenEscapeHtmlAspect_thenEscapeHtml() throws Exception { + + Map requestBody = Map.of( + "name", "James Cameron", + "email", "james@gmail.com" + ); + + Map expectedResponseBody = Map.of( + "name", "James Cameron", + "email", "<script>alert()</script>james@gmail.com" + ); + + ObjectMapper objectMapper = new ObjectMapper(); + + mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java new file mode 100644 index 0000000000..35254eb151 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java @@ -0,0 +1,51 @@ +package com.baeldung.modifyrequest; + +import com.baeldung.modifyrequest.controller.UserController; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.net.URI; +import java.util.Map; + +@ExtendWith(SpringExtension.class) +@AutoConfigureMockMvc +@WebMvcTest(UserController.class) +@ActiveProfiles("filterExample") +public class EscapeHtmlFilterIntegrationTest { + Logger logger = LoggerFactory.getLogger(EscapeHtmlFilterIntegrationTest.class); + + @Autowired + private MockMvc mockMvc; + @Test + void givenFilter_whenEscapeHtmlFilter_thenEscapeHtml() throws Exception { + Map requestBody = Map.of( + "name", "James Cameron", + "email", "james@gmail.com" + ); + + Map expectedResponseBody = Map.of( + "name", "James Cameron", + "email", "<script>alert()</script>james@gmail.com" + ); + + ObjectMapper objectMapper = new ObjectMapper(); + + mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java new file mode 100644 index 0000000000..002481de4f --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java @@ -0,0 +1,46 @@ +package com.baeldung.modifyrequest; + +import com.baeldung.modifyrequest.controller.UserController; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.net.URI; +import java.util.Map; + + +@ExtendWith(SpringExtension.class) +@AutoConfigureMockMvc +@WebMvcTest(UserController.class) +@ActiveProfiles("interceptorExample") +public class EscapeHtmlInterceptorIntegrationTest { + Logger logger = LoggerFactory.getLogger(EscapeHtmlInterceptorIntegrationTest.class); + + @Autowired + private MockMvc mockMvc; + + @Test + void givenInterceptor_whenEscapeHtmlInterceptor_thenEscapeHtml() throws Exception { + Map requestBody = Map.of( + "name", "James Cameron", + "email", "james@gmail.com" + ); + + ObjectMapper objectMapper = new ObjectMapper(); + mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().is4xxClientError()); + } +} From 213fb362a0f94947f85e85eb9dafd4637f1daf1c Mon Sep 17 00:00:00 2001 From: "@hangga" Date: Sat, 18 Nov 2023 14:17:19 +0700 Subject: [PATCH 559/831] simplyfiying test --- .../UUIDPositiveLongGeneratorUnitTest.java | 77 +++---------------- 1 file changed, 10 insertions(+), 67 deletions(-) diff --git a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java index 27ac4fe51e..756bee94e6 100644 --- a/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java +++ b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -1,89 +1,32 @@ package com.baeldung.uuid; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.lang.reflect.Method; -import java.text.DecimalFormat; -import java.util.*; +import java.util.HashSet; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; public class UUIDPositiveLongGeneratorUnitTest { - private final static int NUMBER_OF_CHECKS = 1000000; - private final static double COLLISION_THRESHOLD = 0.001; - private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); - private final Logger logger = LoggerFactory.getLogger(UUIDPositiveLongGeneratorUnitTest.class); - List times = new ArrayList<>(); + //private final UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); + + Set uniqueValues = new HashSet<>(); @Test void whenForeachGenerateLongValue_thenCollisionsCheck() throws Exception { - times.clear(); - printTableHeader(); + UUIDPositiveLongGenerator uuidLongGenerator = new UUIDPositiveLongGenerator(); for (Method method : uuidLongGenerator.getClass().getDeclaredMethods()) { - collisionCheck(method); - } - } - - private void printTableHeader() { - logger.info(String.format("%-25s %15s %15s %15s", "Approach(method name)", "collisions", "probability","Testing Time")); - logger.info("--------------------------------------------------------------------------------"); - } - - private void printOutput(String method, int collisionsCount, double collisionsProbability, String time) { - DecimalFormat decimalFormat = new DecimalFormat("#.#####"); - logger.info(String.format("%-25s %15s %15s %15s", method, collisionsCount, decimalFormat.format(collisionsProbability),time)); - } - - private void collisionCheck(Method method) throws Exception { - long start = System.currentTimeMillis(); - Set uniqueValues = new HashSet<>(); - int collisions = 0; - for (int i = 0; i < NUMBER_OF_CHECKS; i++) { - long uniqueValue = (long) method.invoke(uuidLongGenerator); + long uniqueValue; + do uniqueValue = (long) method.invoke(uuidLongGenerator); while (!isUnique(uniqueValue)); assertThat(uniqueValue).isPositive(); - if (!uniqueValues.add(uniqueValue)) { - collisions++; - } } - double collisionsProbability = (double) collisions / NUMBER_OF_CHECKS; - long end = System.currentTimeMillis(); - String time = convertMillisToTime(end - start); - printOutput(method.getName(), collisions, collisionsProbability, time); - assertThat(collisionsProbability).isLessThan(COLLISION_THRESHOLD); - } private boolean isUnique(long value) { - // Implementasikan logika pengecekan keunikan, misalnya, dengan memeriksa dalam database - // Mengembalikan true jika nilai unik, false jika ada tumbukan - return true; // Implementasikan sesuai kebutuhan aplikasi Anda + // Implement uniqueness checking logic, for example, by checking in the database + return uniqueValues.add(value); } - - private String convertMillisToTime(long currentTimeMillis) { - - long totalMilliseconds = currentTimeMillis % 1000; - times.add(totalMilliseconds); - long totalSeconds = (currentTimeMillis / 1000) % 60; - long totalMinutes = (currentTimeMillis / 60000) % 60; - long hours = (currentTimeMillis / 3600000); - StringJoiner stringBuffer = new StringJoiner(""); - - if (hours > 0){ - stringBuffer.add(hours+"h "); - } - if (totalMinutes > 0){ - stringBuffer.add(totalMinutes+" m "); - } - if (totalSeconds > 0){ - stringBuffer.add(totalSeconds+" s "); - } - if (totalMilliseconds > 0){ - stringBuffer.add(totalMilliseconds+" ms"); - } - return stringBuffer.toString(); - } } From c9321ed9be544b1444d99d43efa02042dece6e49 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:51:09 +0800 Subject: [PATCH 560/831] Update README.md [skip ci] --- patterns-modules/design-patterns-singleton/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns-modules/design-patterns-singleton/README.md b/patterns-modules/design-patterns-singleton/README.md index edec116b93..a4915ebfaf 100644 --- a/patterns-modules/design-patterns-singleton/README.md +++ b/patterns-modules/design-patterns-singleton/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [How to Serialize a Singleton in Java](https://www.baeldung.com/java-serialize-singleton) +- [Bill Pugh Singleton Implementation](https://www.baeldung.com/java-bill-pugh-singleton-implementation) From e264651cfb45520cf11754df075734eae22eb650 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:53:19 +0800 Subject: [PATCH 561/831] Update README.md [skip ci] --- core-java-modules/core-java-io-conversions-2/README.md | 1 + 1 file changed, 1 insertion(+) 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 4e179a84d2..bcc1db5f89 100644 --- a/core-java-modules/core-java-io-conversions-2/README.md +++ b/core-java-modules/core-java-io-conversions-2/README.md @@ -12,4 +12,5 @@ This module contains articles about core Java input/output(IO) conversions. - [How to Convert InputStream to Base64 String](https://www.baeldung.com/java-inputstream-to-base64-string) - [Convert an OutputStream to an InputStream](https://www.baeldung.com/java-convert-outputstream-to-inputstream) - [Java PrintStream to String](https://www.baeldung.com/java-printstream-to-string) +- [Convert File to Byte Array in Java](https://www.baeldung.com/java-convert-file-byte-array) - More articles: [[<-- prev]](/core-java-modules/core-java-io-conversions) From a4ac49de8159bf845a8b259ad716293df789bd60 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:56:47 +0800 Subject: [PATCH 562/831] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index 28e2dccd39..b95153b5be 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -3,3 +3,4 @@ - [How to Center Text Output in Java](https://www.baeldung.com/java-center-text-output) - [Capitalize the First Letter of Each Word in a String](https://www.baeldung.com/java-string-initial-capital-letter-every-word) - [Check if a String Contains Only Unicode Letters](https://www.baeldung.com/java-string-all-unicode-characters) +- [Create a Mutable String in Java](https://www.baeldung.com/java-mutable-string) From c921fdcc1981ef629b1f67d0dacd91f9073a7c5f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:59:00 +0800 Subject: [PATCH 563/831] Update README.md [skip ci] --- core-java-modules/core-java-hex/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-hex/README.md b/core-java-modules/core-java-hex/README.md index 0ba4d1372f..2424137b32 100644 --- a/core-java-modules/core-java-hex/README.md +++ b/core-java-modules/core-java-hex/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Convert Hex to RGB Using Java](https://www.baeldung.com/java-convert-hex-to-rgb) +- [Convert a Hex String to an Integer in Java](https://www.baeldung.com/java-convert-hex-string-to-integer) From 23830bfd79bd091ae8b7ec26b1133333edce5da2 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:02:24 +0800 Subject: [PATCH 564/831] Update README.md [skip ci] --- spring-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md index 318312ace6..43b2f59147 100644 --- a/spring-kafka-2/README.md +++ b/spring-kafka-2/README.md @@ -8,3 +8,4 @@ This module contains articles about Spring with Kafka - [Spring Kafka: Configure Multiple Listeners on Same Topic](https://www.baeldung.com/spring-kafka-multiple-listeners-same-topic) - [Understanding Kafka Topics and Partitions](https://www.baeldung.com/kafka-topics-partitions) - [How to Subscribe a Kafka Consumer to Multiple Topics](https://www.baeldung.com/kafka-subscribe-consumer-multiple-topics) +- [Splitting Streams in Kafka](https://www.baeldung.com/kafka-splitting-streams) From de92bcb45d6a25dad5cf1991cc419fb41e154ad3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:06:22 +0800 Subject: [PATCH 565/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-6/README.md b/core-java-modules/core-java-numbers-6/README.md index cf84e29710..3a2154efdd 100644 --- a/core-java-modules/core-java-numbers-6/README.md +++ b/core-java-modules/core-java-numbers-6/README.md @@ -7,4 +7,5 @@ - [Java Double vs. BigDecimal](https://www.baeldung.com/java-double-vs-bigdecimal) - [Finding the Square Root of a BigInteger in Java](https://www.baeldung.com/java-find-square-root-biginteger) - [Truncate a Double to Two Decimal Places in Java](https://www.baeldung.com/java-double-round-two-decimal-places) +- [Comparing the Values of Two Generic Numbers in Java](https://www.baeldung.com/java-generic-numbers-comparison-methods) - More articles: [[<-- prev]](../core-java-numbers-5) From 2d538b658253fb44713bc117ad9f5dac580e1ca6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:08:25 +0800 Subject: [PATCH 566/831] Update README.md [skip ci] --- testing-modules/selenium-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/selenium-2/README.md b/testing-modules/selenium-2/README.md index 5403fb9f06..a1d180814d 100644 --- a/testing-modules/selenium-2/README.md +++ b/testing-modules/selenium-2/README.md @@ -2,6 +2,7 @@ - [Running Selenium Scripts with JMeter](https://www.baeldung.com/selenium-jmeter) - [Fixing Selenium WebDriver Executable Path Error](https://www.baeldung.com/java-selenium-webdriver-path-error) - [Implicit Wait vs Explicit Wait in Selenium Webdriver](https://www.baeldung.com/selenium-implicit-explicit-wait) +- [Switching Between Frames Using Selenium WebDriver in Java](https://www.baeldung.com/java-selenium-change-frames) #### Notes: - to run the live tests for the article *Fixing Selenium WebDriver Executable Path Error*, follow the manual setup described From 8459887d19faa6734e0263a8d774784d5d1e1d4c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:10:58 +0800 Subject: [PATCH 567/831] Update README.md [skip ci] --- core-java-modules/core-java-sun/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-sun/README.md b/core-java-modules/core-java-sun/README.md index 107035cbe8..54eae58d3e 100644 --- a/core-java-modules/core-java-sun/README.md +++ b/core-java-modules/core-java-sun/README.md @@ -5,4 +5,5 @@ This module contains articles about the sun package ### Relevant Articles: - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) -- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) \ No newline at end of file +- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) +- [Why Is sun.misc.Unsafe.park Actually Unsafe?](https://www.baeldung.com/java-sun-misc-unsafe-park-reason) From f589231fde9f5bb62ba2df6495d314e0e47accc1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:14:42 +0800 Subject: [PATCH 568/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md index 4869158d2b..acee8154f7 100644 --- a/core-java-modules/core-java-collections-5/README.md +++ b/core-java-modules/core-java-collections-5/README.md @@ -9,4 +9,5 @@ - [Skipping the First Iteration in Java](https://www.baeldung.com/java-skip-first-iteration) - [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue) - [Intro to Vector Class in Java](https://www.baeldung.com/java-vector-guide) +- [HashSet toArray() Method in Java](https://www.baeldung.com/java-hashset-toarray) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) From e5fbd59087857f3940e45e308be553f47f3ec107 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:17:12 +0800 Subject: [PATCH 569/831] Create README.md [skip ci] --- persistence-modules/core-java-persistence-3/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/core-java-persistence-3/README.md diff --git a/persistence-modules/core-java-persistence-3/README.md b/persistence-modules/core-java-persistence-3/README.md new file mode 100644 index 0000000000..6ca158560b --- /dev/null +++ b/persistence-modules/core-java-persistence-3/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Convert ResultSet Into Map](https://www.baeldung.com/java-resultset-map) From 47b2fef64f2d6a535073e06be9339a9ad014e43b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:20:17 +0800 Subject: [PATCH 570/831] Update README.md [skip ci] --- persistence-modules/spring-boot-persistence-mongodb-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/README.md b/persistence-modules/spring-boot-persistence-mongodb-3/README.md index ee6a96397a..e234c2b3a1 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-3/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb-3/README.md @@ -1,4 +1,5 @@ # Relevant Articles - [How to Insert a HashMap Into MongoDB With Java?](https://www.baeldung.com/java-mongodb-insert-hashmap) - [MongoDB – Field Level Encryption](https://www.baeldung.com/mongodb-field-level-encryption) +- [MongoDB Atlas Search Using the Java Driver and Spring Data](https://www.baeldung.com/mongodb-spring-data-atlas-search) - More articles: [[<--prev]](../spring-boot-persistence-mongodb-2) From 3a3459f2b804a2ef5ee56700b83cd35141f18f23 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:22:32 +0800 Subject: [PATCH 571/831] Update README.md [skip ci] --- core-java-modules/core-java-sun/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-sun/README.md b/core-java-modules/core-java-sun/README.md index 54eae58d3e..82977bca6c 100644 --- a/core-java-modules/core-java-sun/README.md +++ b/core-java-modules/core-java-sun/README.md @@ -7,3 +7,4 @@ This module contains articles about the sun package - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) - [Why Is sun.misc.Unsafe.park Actually Unsafe?](https://www.baeldung.com/java-sun-misc-unsafe-park-reason) +- [Sharing Memory Between JVMs](https://www.baeldung.com/java-sharing-memory-between-jvms) From ccba711e86815cbb9bdd717ac863b9a70c43fad7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:24:21 +0800 Subject: [PATCH 572/831] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-3/README.md b/core-java-modules/core-java-concurrency-basic-3/README.md index 09d085a32b..1021544e11 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -12,4 +12,5 @@ This module contains articles about basic Java concurrency. - [CompletableFuture allOf().join() vs. CompletableFuture.join()](https://www.baeldung.com/java-completablefuture-allof-join) - [Retry Logic with CompletableFuture](https://www.baeldung.com/java-completablefuture-retry-logic) - [Convert From List of CompletableFuture to CompletableFuture List](https://www.baeldung.com/java-completablefuture-list-convert) +- [Synchronize a Static Variable Among Different Threads](https://www.baeldung.com/java-synchronize-static-variable-different-threads) - [[<-- Prev]](../core-java-concurrency-basic-2) From 2d7f1c60a7128a96aa347d435985cd61207819f3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:26:37 +0800 Subject: [PATCH 573/831] Update README.md [skip ci] --- core-java-modules/core-java-console/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-console/README.md b/core-java-modules/core-java-console/README.md index 180193d8c1..77ad16d015 100644 --- a/core-java-modules/core-java-console/README.md +++ b/core-java-modules/core-java-console/README.md @@ -7,3 +7,4 @@ - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [System.console() vs. System.out](https://www.baeldung.com/java-system-console-vs-system-out) - [How to Log to the Console in Color](https://www.baeldung.com/java-log-console-in-color) +- [Create Table Using ASCII in a Console in Java](https://www.baeldung.com/java-console-ascii-make-table) From cf421052d972731820f5c9e74b87b457227ba116 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:30:06 +0800 Subject: [PATCH 574/831] Update README.md [skip ci] --- core-java-modules/core-java-8-datetime-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md index 462a4be6f1..f7ada52da6 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -7,4 +7,5 @@ - [Difference Between Instant and LocalDateTime](https://www.baeldung.com/java-instant-vs-localdatetime) - [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins) - [Round the Date in Java](https://www.baeldung.com/java-round-the-date) +- [Representing Furthest Possible Date in Java](https://www.baeldung.com/java-date-represent-max) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From b62d0436d4de59f26ece1b2808c2ecf5105963eb Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:33:12 +0800 Subject: [PATCH 575/831] Update README.md [skip ci] --- core-java-modules/core-java-streams-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md index 64bc4e6b7a..dfd5a649b5 100644 --- a/core-java-modules/core-java-streams-5/README.md +++ b/core-java-modules/core-java-streams-5/README.md @@ -7,3 +7,4 @@ - [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams) - [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration) - [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap) +- [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception) From 66b8dc1411c5c82db4fc431859dde3e128eb248e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:35:11 +0800 Subject: [PATCH 576/831] Update README.md [skip ci] --- apache-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-kafka-2/README.md b/apache-kafka-2/README.md index 40ee701be1..3aa8fcf4ad 100644 --- a/apache-kafka-2/README.md +++ b/apache-kafka-2/README.md @@ -14,3 +14,4 @@ You can build the project from the command line using: *mvn clean install*, or i - [Get Partition Count for a Topic in Kafka](https://www.baeldung.com/java-kafka-partition-count-topic) - [bootstrap-server in Kafka Configuration](https://www.baeldung.com/java-kafka-bootstrap-server) - [Introduction to Apache Kafka](https://www.baeldung.com/apache-kafka) +- [Ensuring Message Ordering in Kafka: Strategies and Configurations](https://www.baeldung.com/kafka-message-ordering) From 607fc54bf009a23551a107dc2bcd3f45ba66280c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 20:48:00 +0800 Subject: [PATCH 577/831] Update README.md --- core-java-modules/core-java-string-operations-6/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-6/README.md b/core-java-modules/core-java-string-operations-6/README.md index 9d92552dd1..506b548304 100644 --- a/core-java-modules/core-java-string-operations-6/README.md +++ b/core-java-modules/core-java-string-operations-6/README.md @@ -11,4 +11,3 @@ - [Check if a String Has All Unique Characters in Java](https://www.baeldung.com/java-check-string-all-unique-chars) - [Performance Comparison Between Different Java String Concatenation Methods](https://www.baeldung.com/java-string-concatenation-methods) - [Replacing Single Quote with \’ in Java String](https://www.baeldung.com/java-replacing-single-quote-string) -- [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence) From cf51f27dfc3bf62af25ef71b3a6b6e42ba510ec1 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sat, 18 Nov 2023 20:48:36 +0800 Subject: [PATCH 578/831] Update README.md --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index b95153b5be..2b9c4c25f3 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -4,3 +4,4 @@ - [Capitalize the First Letter of Each Word in a String](https://www.baeldung.com/java-string-initial-capital-letter-every-word) - [Check if a String Contains Only Unicode Letters](https://www.baeldung.com/java-string-all-unicode-characters) - [Create a Mutable String in Java](https://www.baeldung.com/java-mutable-string) +- [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence) From 1c10f4f35b1e42572c34ae5e48ac354535cb7cc9 Mon Sep 17 00:00:00 2001 From: danielmcnally285 <144589379+danielmcnally285@users.noreply.github.com> Date: Sat, 18 Nov 2023 20:25:43 +0000 Subject: [PATCH 579/831] change 2 spaces for fluent apis to 4 --- .../ReturnFirstNonEmptyOptionalUnitTest.java | 6 +++--- .../ReturnFirstNonNullLazyEvaluateUnitTest.java | 6 +++--- .../returnfirstnonnull/ReturnFirstNonNullUnitTest.java | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java index b05e0e2d34..f2ea8f74e3 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonempty/ReturnFirstNonEmptyOptionalUnitTest.java @@ -21,9 +21,9 @@ public class ReturnFirstNonEmptyOptionalUnitTest { @Test void givenListOfOptionals_whenStreaming_thenReturnFirstNonEmpty() { Optional object = optionals.stream() - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst(); assertThat(object).contains("first non empty"); } diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java index 56c846eb0e..af88545170 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullLazyEvaluateUnitTest.java @@ -48,9 +48,9 @@ public class ReturnFirstNonNullLazyEvaluateUnitTest { @Test void givenChainOfMethods_whenUsingSupplierInterface_thenLazilyEvaluateMethodsUntilFirstNonNull() { Optional object = Stream.> of(spy::methodA, spy::methodB, spy::methodC) - .map(Supplier::get) - .filter(Objects::nonNull) - .findFirst(); + .map(Supplier::get) + .filter(Objects::nonNull) + .findFirst(); assertThat(object).contains("first non null"); verify(spy, times(1)).methodA(); diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java index 32c95f0e84..124de5843c 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/returnfirstnonnull/ReturnFirstNonNullUnitTest.java @@ -28,8 +28,8 @@ public class ReturnFirstNonNullUnitTest { @Test void givenListOfObjects_whenFilterIsLambdaNullCheckInStream_thenReturnFirstNonNull() { Optional object = objects.stream() - .filter(o -> o != null) - .findFirst(); + .filter(o -> o != null) + .findFirst(); assertThat(object).contains("first non null"); } @@ -37,8 +37,8 @@ public class ReturnFirstNonNullUnitTest { @Test void givenListOfObjects_whenFilterIsMethodRefNullCheckInStream_thenReturnFirstNonNull() { Optional object = objects.stream() - .filter(Objects::nonNull) - .findFirst(); + .filter(Objects::nonNull) + .findFirst(); assertThat(object).contains("first non null"); } From 80da8b957d2633c47de5973dd062722ada1b6312 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 19 Nov 2023 11:48:20 +0100 Subject: [PATCH 580/831] JAVA-13263 | individual build (#15221) * JAVA-13263 | individual build * JAVA-13263 | updating wrapper to more recent version of gradle 7 * JAVA-13263 | adding wrapper jar --- gradle-modules/.gitignore | 1 + gradle-modules/gradle-5/README.md | 2 + .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- gradle-modules/gradle/gradle/shipkit.gradle | 41 ------------------ .../gradle/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 ++- 10 files changed, 11 insertions(+), 45 deletions(-) create mode 100644 gradle-modules/.gitignore create mode 100644 gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle-modules/gradle/gradle/shipkit.gradle create mode 100644 gradle-modules/gradle/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle-modules/.gitignore b/gradle-modules/.gitignore new file mode 100644 index 0000000000..63b7142f43 --- /dev/null +++ b/gradle-modules/.gitignore @@ -0,0 +1 @@ +!gradle-wrapper.jar \ No newline at end of file diff --git a/gradle-modules/gradle-5/README.md b/gradle-modules/gradle-5/README.md index 7871c0e822..6d701ac43c 100644 --- a/gradle-modules/gradle-5/README.md +++ b/gradle-modules/gradle-5/README.md @@ -1,5 +1,7 @@ ### Relevant Articles: +This module is using gradle-8.3. + - [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main) - [Finding Unused Gradle Dependencies](https://www.baeldung.com/gradle-finding-unused-dependencies) - [Intro to Gradle Lint Plugin](https://www.baeldung.com/java-gradle-lint-intro) diff --git a/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties index 94920145f3..cd141cfc9d 100644 --- a/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle-6/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists + diff --git a/gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-8/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et zwk~hMkhq;MOw^Q5`7oC{CUUyTw9x>^%*FHx^qJw(LB+E0WBX@{Ghw;)6aA-KyYg8p z7XDveQOpEr;B4je@2~usI5BlFadedX^ma{b{ypd|RNYqo#~d*mj&y`^iojR}s%~vF z(H!u`yx68D1Tj(3(m;Q+Ma}s2n#;O~bcB1`lYk%Irx60&-nWIUBr2x&@}@76+*zJ5 ze&4?q8?m%L9c6h=J$WBzbiTf1Z-0Eb5$IZs>lvm$>1n_Mezp*qw_pr8<8$6f)5f<@ zyV#tzMCs51nTv_5ca`x`yfE5YA^*%O_H?;tWYdM_kHPubA%vy47i=9>Bq) zRQ&0UwLQHeswmB1yP)+BiR;S+Vc-5TX84KUA;8VY9}yEj0eESSO`7HQ4lO z4(CyA8y1G7_C;6kd4U3K-aNOK!sHE}KL_-^EDl(vB42P$2Km7$WGqNy=%fqB+ zSLdrlcbEH=T@W8V4(TgoXZ*G1_aq$K^@ek=TVhoKRjw;HyI&coln|uRr5mMOy2GXP zwr*F^Y|!Sjr2YQXX(Fp^*`Wk905K%$bd03R4(igl0&7IIm*#f`A!DCarW9$h$z`kYk9MjjqN&5-DsH@8xh63!fTNPxWsFQhNv z#|3RjnP$Thdb#Ys7M+v|>AHm0BVTw)EH}>x@_f4zca&3tXJhTZ8pO}aN?(dHo)44Z z_5j+YP=jMlFqwvf3lq!57-SAuRV2_gJ*wsR_!Y4Z(trO}0wmB9%f#jNDHPdQGHFR; zZXzS-$`;7DQ5vF~oSgP3bNV$6Z(rwo6W(U07b1n3UHqml>{=6&-4PALATsH@Bh^W? z)ob%oAPaiw{?9HfMzpGb)@Kys^J$CN{uf*HX?)z=g`J(uK1YO^8~s1(ZIbG%Et(|q z$D@_QqltVZu9Py4R0Ld8!U|#`5~^M=b>fnHthzKBRr=i+w@0Vr^l|W;=zFT#PJ?*a zbC}G#It}rQP^Ait^W&aa6B;+0gNvz4cWUMzpv(1gvfw-X4xJ2Sv;mt;zb2Tsn|kSS zo*U9N?I{=-;a-OybL4r;PolCfiaL=y@o9{%`>+&FI#D^uy#>)R@b^1ue&AKKwuI*` zx%+6r48EIX6nF4o;>)zhV_8(IEX})NGU6Vs(yslrx{5fII}o3SMHW7wGtK9oIO4OM&@@ECtXSICLcPXoS|{;=_yj>hh*%hP27yZwOmj4&Lh z*Nd@OMkd!aKReoqNOkp5cW*lC)&C$P?+H3*%8)6HcpBg&IhGP^77XPZpc%WKYLX$T zsSQ$|ntaVVOoRat$6lvZO(G-QM5s#N4j*|N_;8cc2v_k4n6zx9c1L4JL*83F-C1Cn zaJhd;>rHXB%%ZN=3_o3&Qd2YOxrK~&?1=UuN9QhL$~OY-Qyg&})#ez*8NpQW_*a&kD&ANjedxT0Ar z<6r{eaVz3`d~+N~vkMaV8{F?RBVemN(jD@S8qO~L{rUw#=2a$V(7rLE+kGUZ<%pdr z?$DP|Vg#gZ9S}w((O2NbxzQ^zTot=89!0^~hE{|c9q1hVzv0?YC5s42Yx($;hAp*E zyoGuRyphQY{Q2ee0Xx`1&lv(l-SeC$NEyS~8iil3_aNlnqF_G|;zt#F%1;J)jnPT& z@iU0S;wHJ2$f!juqEzPZeZkjcQ+Pa@eERSLKsWf=`{R@yv7AuRh&ALRTAy z8=g&nxsSJCe!QLchJ=}6|LshnXIK)SNd zRkJNiqHwKK{SO;N5m5wdL&qK`v|d?5<4!(FAsDxR>Ky#0#t$8XCMptvNo?|SY?d8b z`*8dVBlXTUanlh6n)!EHf2&PDG8sXNAt6~u-_1EjPI1|<=33T8 zEnA00E!`4Ave0d&VVh0e>)Dc}=FfAFxpsC1u9ATfQ`-Cu;mhc8Z>2;uyXtqpLb7(P zd2F9<3cXS} znMg?{&8_YFTGRQZEPU-XPq55%51}RJpw@LO_|)CFAt62-_!u_Uq$csc+7|3+TV_!h z+2a7Yh^5AA{q^m|=KSJL+w-EWDBc&I_I1vOr^}P8i?cKMhGy$CP0XKrQzCheG$}G# zuglf8*PAFO8%xop7KSwI8||liTaQ9NCAFarr~psQt)g*pC@9bORZ>m`_GA`_K@~&% zijH0z;T$fd;-Liw8%EKZas>BH8nYTqsK7F;>>@YsE=Rqo?_8}UO-S#|6~CAW0Oz1} z3F(1=+#wrBJh4H)9jTQ_$~@#9|Bc1Pd3rAIA_&vOpvvbgDJOM(yNPhJJq2%PCcMaI zrbe~toYzvkZYQ{ea(Wiyu#4WB#RRN%bMe=SOk!CbJZv^m?Flo5p{W8|0i3`hI3Np# zvCZqY%o258CI=SGb+A3yJe~JH^i{uU`#U#fvSC~rWTq+K`E%J@ zasU07&pB6A4w3b?d?q}2=0rA#SA7D`X+zg@&zm^iA*HVi z009#PUH<%lk4z~p^l0S{lCJk1Uxi=F4e_DwlfHA`X`rv(|JqWKAA5nH+u4Da+E_p+ zVmH@lg^n4ixs~*@gm_dgQ&eDmE1mnw5wBz9Yg?QdZwF|an67Xd*x!He)Gc8&2!urh z4_uXzbYz-aX)X1>&iUjGp;P1u8&7TID0bTH-jCL&Xk8b&;;6p2op_=y^m@Nq*0{#o!!A;wNAFG@0%Z9rHo zcJs?Th>Ny6+hI`+1XoU*ED$Yf@9f91m9Y=#N(HJP^Y@ZEYR6I?oM{>&Wq4|v0IB(p zqX#Z<_3X(&{H+{3Tr|sFy}~=bv+l=P;|sBz$wk-n^R`G3p0(p>p=5ahpaD7>r|>pm zv;V`_IR@tvZreIuv2EM7ZQHhO+qUgw#kOs%*ekY^n|=1#x9&c;Ro&I~{rG-#_3ZB1 z?|9}IFdbP}^DneP*T-JaoYHt~r@EfvnPE5EKUwIxjPbsr$% zfWW83pgWST7*B(o=kmo)74$8UU)v0{@4DI+ci&%=#90}!CZz|rnH+Mz=HN~97G3~@ z;v5(9_2%eca(9iu@J@aqaMS6*$TMw!S>H(b z4(*B!|H|8&EuB%mITr~O?vVEf%(Gr)6E=>H~1VR z&1YOXluJSG1!?TnT)_*YmJ*o_Q@om~(GdrhI{$Fsx_zrkupc#y{DK1WOUR>tk>ZE) ziOLoBkhZZ?0Uf}cm>GsA>Rd6V8@JF)J*EQlQ<=JD@m<)hyElXR0`pTku*3MU`HJn| zIf7$)RlK^pW-$87U;431;Ye4Ie+l~_B3*bH1>*yKzn23cH0u(i5pXV! z4K?{3oF7ZavmmtTq((wtml)m6i)8X6ot_mrE-QJCW}Yn!(3~aUHYG=^fA<^~`e3yc z-NWTb{gR;DOUcK#zPbN^D*e=2eR^_!(!RKkiwMW@@yYtEoOp4XjOGgzi`;=8 zi3`Ccw1%L*y(FDj=C7Ro-V?q)-%p?Ob2ZElu`eZ99n14-ZkEV#y5C+{Pq87Gu3&>g zFy~Wk7^6v*)4pF3@F@rE__k3ikx(hzN3@e*^0=KNA6|jC^B5nf(XaoQaZN?Xi}Rn3 z$8&m*KmWvPaUQ(V<#J+S&zO|8P-#!f%7G+n_%sXp9=J%Z4&9OkWXeuZN}ssgQ#Tcj z8p6ErJQJWZ+fXLCco=RN8D{W%+*kko*2-LEb))xcHwNl~Xmir>kmAxW?eW50Osw3# zki8Fl$#fvw*7rqd?%E?}ZX4`c5-R&w!Y0#EBbelVXSng+kUfeUiqofPehl}$ormli zg%r)}?%=?_pHb9`Cq9Z|B`L8b>(!+8HSX?`5+5mm81AFXfnAt1*R3F z%b2RPIacKAddx%JfQ8l{3U|vK@W7KB$CdLqn@wP^?azRks@x8z59#$Q*7q!KilY-P zHUbs(IFYRGG1{~@RF;Lqyho$~7^hNC`NL3kn^Td%A7dRgr_&`2k=t+}D-o9&C!y^? z6MsQ=tc3g0xkK(O%DzR9nbNB(r@L;1zQrs8mzx&4dz}?3KNYozOW5;=w18U6$G4U2 z#2^qRLT*Mo4bV1Oeo1PKQ2WQS2Y-hv&S|C7`xh6=Pj7MNLC5K-zokZ67S)C;(F0Dd zloDK2_o1$Fmza>EMj3X9je7e%Q`$39Dk~GoOj89-6q9|_WJlSl!!+*{R=tGp z8u|MuSwm^t7K^nUe+^0G3dkGZr3@(X+TL5eah)K^Tn zXEtHmR9UIaEYgD5Nhh(s*fcG_lh-mfy5iUF3xxpRZ0q3nZ=1qAtUa?(LnT9I&~uxX z`pV?+=|-Gl(kz?w!zIieXT}o}7@`QO>;u$Z!QB${a08_bW0_o@&9cjJUXzVyNGCm8 zm=W+$H!;_Kzp6WQqxUI;JlPY&`V}9C$8HZ^m?NvI*JT@~BM=()T()Ii#+*$y@lTZBkmMMda>7s#O(1YZR+zTG@&}!EXFG{ zEWPSDI5bFi;NT>Yj*FjH((=oe%t%xYmE~AGaOc4#9K_XsVpl<4SP@E!TgC0qpe1oi zNpxU2b0(lEMcoibQ-G^cxO?ySVW26HoBNa;n0}CWL*{k)oBu1>F18X061$SP{Gu67 z-v-Fa=Fl^u3lnGY^o5v)Bux}bNZ~ z5pL+7F_Esoun8^5>z8NFoIdb$sNS&xT8_|`GTe8zSXQzs4r^g0kZjg(b0bJvz`g<70u9Z3fQILX1Lj@;@+##bP|FAOl)U^9U>0rx zGi)M1(Hce)LAvQO-pW!MN$;#ZMX?VE(22lTlJrk#pB0FJNqVwC+*%${Gt#r_tH9I_ z;+#)#8cWAl?d@R+O+}@1A^hAR1s3UcW{G+>;X4utD2d9X(jF555}!TVN-hByV6t+A zdFR^aE@GNNgSxxixS2p=on4(+*+f<8xrwAObC)D5)4!z7)}mTpb7&ofF3u&9&wPS< zB62WHLGMhmrmOAgmJ+|c>qEWTD#jd~lHNgT0?t-p{T=~#EMcB| z=AoDKOL+qXCfk~F)-Rv**V}}gWFl>liXOl7Uec_8v)(S#av99PX1sQIVZ9eNLkhq$ zt|qu0b?GW_uo}TbU8!jYn8iJeIP)r@;!Ze_7mj{AUV$GEz6bDSDO=D!&C9!M@*S2! zfGyA|EPlXGMjkH6x7OMF?gKL7{GvGfED=Jte^p=91FpCu)#{whAMw`vSLa`K#atdN zThnL+7!ZNmP{rc=Z>%$meH;Qi1=m1E3Lq2D_O1-X5C;!I0L>zur@tPAC9*7Jeh)`;eec}1`nkRP(%iv-`N zZ@ip-g|7l6Hz%j%gcAM}6-nrC8oA$BkOTz^?dakvX?`^=ZkYh%vUE z9+&)K1UTK=ahYiaNn&G5nHUY5niLGus@p5E2@RwZufRvF{@$hW{;{3QhjvEHMvduO z#Wf-@oYU4ht?#uP{N3utVzV49mEc9>*TV_W2TVC`6+oI)zAjy$KJrr=*q##&kobiQ z1vNbya&OVjK`2pdRrM?LuK6BgrLN7H_3m z!qpNKg~87XgCwb#I=Q&0rI*l$wM!qTkXrx1ko5q-f;=R2fImRMwt5Qs{P*p^z@9ex z`2#v(qE&F%MXlHpdO#QEZyZftn4f05ab^f2vjxuFaat2}jke{j?5GrF=WYBR?gS(^ z9SBiNi}anzBDBRc+QqizTTQuJrzm^bNA~A{j%ugXP7McZqJ}65l10({wk++$=e8O{ zxWjG!Qp#5OmI#XRQQM?n6?1ztl6^D40hDJr?4$Wc&O_{*OfMfxe)V0=e{|N?J#fgE>j9jAajze$iN!*yeF%jJU#G1c@@rm zolGW!j?W6Q8pP=lkctNFdfgUMg92wlM4E$aks1??M$~WQfzzzXtS)wKrr2sJeCN4X zY(X^H_c^PzfcO8Bq(Q*p4c_v@F$Y8cHLrH$`pJ2}=#*8%JYdqsqnGqEdBQMpl!Ot04tUGSXTQdsX&GDtjbWD=prcCT9(+ z&UM%lW%Q3yrl1yiYs;LxzIy>2G}EPY6|sBhL&X&RAQrSAV4Tlh2nITR?{6xO9ujGu zr*)^E`>o!c=gT*_@6S&>0POxcXYNQd&HMw6<|#{eSute2C3{&h?Ah|cw56-AP^f8l zT^kvZY$YiH8j)sk7_=;gx)vx-PW`hbSBXJGCTkpt;ap(}G2GY=2bbjABU5)ty%G#x zAi07{Bjhv}>OD#5zh#$0w;-vvC@^}F! z#X$@)zIs1L^E;2xDAwEjaXhTBw2<{&JkF*`;c3<1U@A4MaLPe{M5DGGkL}#{cHL%* zYMG+-Fm0#qzPL#V)TvQVI|?_M>=zVJr9>(6ib*#z8q@mYKXDP`k&A4A};xMK0h=yrMp~JW{L?mE~ph&1Y1a#4%SO)@{ zK2juwynUOC)U*hVlJU17%llUxAJFuKZh3K0gU`aP)pc~bE~mM!i1mi!~LTf>1Wp< zuG+ahp^gH8g8-M$u{HUWh0m^9Rg@cQ{&DAO{PTMudV6c?ka7+AO& z746QylZ&Oj`1aqfu?l&zGtJnpEQOt;OAFq19MXTcI~`ZcoZmyMrIKDFRIDi`FH)w; z8+*8tdevMDv*VtQi|e}CnB_JWs>fhLOH-+Os2Lh!&)Oh2utl{*AwR)QVLS49iTp{6 z;|172Jl!Ml17unF+pd+Ff@jIE-{Oxv)5|pOm@CkHW?{l}b@1>Pe!l}VccX#xp@xgJ zyE<&ep$=*vT=}7vtvif0B?9xw_3Gej7mN*dOHdQPtW5kA5_zGD zpA4tV2*0E^OUimSsV#?Tg#oiQ>%4D@1F5@AHwT8Kgen$bSMHD3sXCkq8^(uo7CWk`mT zuslYq`6Yz;L%wJh$3l1%SZv#QnG3=NZ=BK4yzk#HAPbqXa92;3K5?0kn4TQ`%E%X} z&>Lbt!!QclYKd6+J7Nl@xv!uD%)*bY-;p`y^ZCC<%LEHUi$l5biu!sT3TGGSTPA21 zT8@B&a0lJHVn1I$I3I1I{W9fJAYc+8 zVj8>HvD}&O`TqU2AAb={?eT;0hyL(R{|h23=4fDSZKC32;wWxsVj`P z3J3{M$PwdH!ro*Cn!D&=jnFR>BNGR<<|I8CI@+@658Dy(lhqbhXfPTVecY@L8%`3Q z1Fux2w?2C3th60jI~%OC9BtpNF$QPqcG+Pz96qZJ71_`0o0w_q7|h&O>`6U+^BA&5 zXd5Zp1Xkw~>M%RixTm&OqpNl8Q+ue=92Op_>T~_9UON?ZM2c0aGm=^A4ejrXj3dV9 zhh_bCt-b9`uOX#cFLj!vhZ#lS8Tc47OH>*)y#{O9?AT~KR9LntM|#l#Dlm^8{nZdk zjMl#>ZM%#^nK2TPzLcKxqx24P7R1FPlBy7LSBrRvx>fE$9AJ;7{PQm~^LBX^k#6Zq zw*Z(zJC|`!6_)EFR}8|n8&&Rbj8y028~P~sFXBFRt+tmqH-S3<%N;C&WGH!f3{7cm zy_fCAb9@HqaXa1Y5vFbxWf%#zg6SI$C+Uz5=CTO}e|2fjWkZ;Dx|84Ow~bkI=LW+U zuq;KSv9VMboRvs9)}2PAO|b(JCEC_A0wq{uEj|3x@}*=bOd zwr{TgeCGG>HT<@Zeq8y}vTpwDg#UBvD)BEs@1KP$^3$sh&_joQPn{hjBXmLPJ{tC) z*HS`*2+VtJO{|e$mM^|qv1R*8i(m1`%)}g=SU#T#0KlTM2RSvYUc1fP+va|4;5}Bfz98UvDCpq7}+SMV&;nX zQw~N6qOX{P55{#LQkrZk(e5YGzr|(B;Q;ju;2a`q+S9bsEH@i1{_Y0;hWYn1-79jl z5c&bytD*k)GqrVcHn6t-7kinadiD>B{Tl`ZY@`g|b~pvHh5!gKP4({rp?D0aFd_cN zhHRo4dd5^S6ViN(>(28qZT6E>??aRhc($kP`>@<+lIKS5HdhjVU;>f7<4))E*5|g{ z&d1}D|vpuV^eRj5j|xx9nwaCxXFG?Qbjn~_WSy=N}P0W>MP zG-F%70lX5Xr$a)2i6?i|iMyM|;Jtf*hO?=Jxj12oz&>P=1#h~lf%#fc73M2_(SUM- zf&qnjS80|_Y0lDgl&I?*eMumUklLe_=Td!9G@eR*tcPOgIShJipp3{A10u(4eT~DY zHezEj8V+7m!knn7)W!-5QI3=IvC^as5+TW1@Ern@yX| z7Nn~xVx&fGSr+L%4iohtS3w^{-H1A_5=r&x8}R!YZvp<2T^YFvj8G_vm}5q;^UOJf ztl=X3iL;;^^a#`t{Ae-%5Oq{?M#s6Npj+L(n-*LMI-yMR{)qki!~{5z{&`-iL}lgW zxo+tnvICK=lImjV$Z|O_cYj_PlEYCzu-XBz&XC-JVxUh9;6*z4fuBG+H{voCC;`~GYV|hj%j_&I zDZCj>Q_0RCwFauYoVMiUSB+*Mx`tg)bWmM^SwMA+?lBg12QUF_x2b)b?qb88K-YUd z0dO}3k#QirBV<5%jL$#wlf!60dizu;tsp(7XLdI=eQs?P`tOZYMjVq&jE)qK*6B^$ zBe>VvH5TO>s>izhwJJ$<`a8fakTL!yM^Zfr2hV9`f}}VVUXK39p@G|xYRz{fTI+Yq z20d=)iwjuG9RB$%$^&8#(c0_j0t_C~^|n+c`Apu|x7~;#cS-s=X1|C*YxX3ailhg_|0`g!E&GZJEr?bh#Tpb8siR=JxWKc{#w7g zWznLwi;zLFmM1g8V5-P#RsM@iX>TK$xsWuujcsVR^7TQ@!+vCD<>Bk9tdCo7Mzgq5 zv8d>dK9x8C@Qoh01u@3h0X_`SZluTb@5o;{4{{eF!-4405x8X7hewZWpz z2qEi4UTiXTvsa(0X7kQH{3VMF>W|6;6iTrrYD2fMggFA&-CBEfSqPlQDxqsa>{e2M z(R5PJ7uOooFc|9GU0ELA%m4&4Ja#cQpNw8i8ACAoK6?-px+oBl_yKmenZut#Xumjz zk8p^OV2KY&?5MUwGrBOo?ki`Sxo#?-Q4gw*Sh0k`@ zFTaYK2;}%Zk-68`#5DXU$2#=%YL#S&MTN8bF+!J2VT6x^XBci6O)Q#JfW{YMz) zOBM>t2rSj)n#0a3cjvu}r|k3od6W(SN}V-cL?bi*Iz-8uOcCcsX0L>ZXjLqk zZu2uHq5B|Kt>e+=pPKu=1P@1r9WLgYFq_TNV1p9pu0erHGd!+bBp!qGi+~4A(RsYN@CyXNrC&hxGmW)u5m35OmWwX`I+0yByglO`}HC4nGE^_HUs^&A(uaM zKPj^=qI{&ayOq#z=p&pnx@@k&I1JI>cttJcu@Ihljt?6p^6{|ds`0MoQwp+I{3l6` zB<9S((RpLG^>=Kic`1LnhpW2=Gu!x`m~=y;A`Qk!-w`IN;S8S930#vBVMv2vCKi}u z6<-VPrU0AnE&vzwV(CFC0gnZYcpa-l5T0ZS$P6(?9AM;`Aj~XDvt;Jua=jIgF=Fm? zdp=M$>`phx%+Gu};;-&7T|B1AcC#L4@mW5SV_^1BRbo6;2PWe$r+npRV`yc;T1mo& z+~_?7rA+(Um&o@Tddl zL_hxvWk~a)yY}%j`Y+200D%9$bWHy&;(yj{jpi?Rtz{J66ANw)UyPOm;t6FzY3$hx zcn)Ir79nhFvNa7^a{SHN7XH*|Vlsx`CddPnA&Qvh8aNhEA;mPVv;Ah=k<*u!Zq^7 z<=xs*iQTQOMMcg|(NA_auh@x`3#_LFt=)}%SQppP{E>mu_LgquAWvh<>L7tf9+~rO znwUDS52u)OtY<~!d$;m9+87aO+&`#2ICl@Y>&F{jI=H(K+@3M1$rr=*H^dye#~TyD z!){#Pyfn+|ugUu}G;a~!&&0aqQ59U@UT3|_JuBlYUpT$2+11;}JBJ`{+lQN9T@QFY z5+`t;6(TS0F?OlBTE!@7D`8#URDNqx2t6`GZ{ZgXeS@v%-eJzZOHz18aS|svxII$a zZeFjrJ*$IwX$f-Rzr_G>xbu@euGl)B7pC&S+CmDJBg$BoV~jxSO#>y z33`bupN#LDoW0feZe0%q8un0rYN|eRAnwDHQ6e_)xBTbtoZtTA=Fvk){q}9Os~6mQ zKB80VI_&6iSq`LnK7*kfHZoeX6?WE}8yjuDn=2#JG$+;-TOA1%^=DnXx%w{b=w}tS zQbU3XxtOI8E(!%`64r2`zog;5<0b4i)xBmGP^jiDZ2%HNSxIf3@wKs~uk4%3Mxz;~ zts_S~E4>W+YwI<-*-$U8*^HKDEa8oLbmqGg?3vewnaNg%Mm)W=)lcC_J+1ov^u*N3 zXJ?!BrH-+wGYziJq2Y#vyry6Z>NPgkEk+Ke`^DvNRdb>Q2Nlr#v%O@<5hbflI6EKE z9dWc0-ORk^T}jP!nkJ1imyjdVX@GrjOs%cpgA8-c&FH&$(4od#x6Y&=LiJZPINVyW z0snY$8JW@>tc2}DlrD3StQmA0Twck~@>8dSix9CyQOALcREdxoM$Sw*l!}bXKq9&r zysMWR@%OY24@e`?+#xV2bk{T^C_xSo8v2ZI=lBI*l{RciPwuE>L5@uhz@{!l)rtVlWC>)6(G)1~n=Q|S!{E9~6*fdpa*n z!()-8EpTdj=zr_Lswi;#{TxbtH$8*G=UM`I+icz7sr_SdnHXrv=?iEOF1UL+*6O;% zPw>t^kbW9X@oEXx<97%lBm-9?O_7L!DeD)Me#rwE54t~UBu9VZ zl_I1tBB~>jm@bw0Aljz8! zXBB6ATG6iByKIxs!qr%pz%wgqbg(l{65DP4#v(vqhhL{0b#0C8mq`bnqZ1OwFV z7mlZZJFMACm>h9v^2J9+^_zc1=JjL#qM5ZHaThH&n zXPTsR8(+)cj&>Un{6v*z?@VTLr{TmZ@-fY%*o2G}*G}#!bmqpoo*Ay@U!JI^Q@7gj;Kg-HIrLj4}#ec4~D2~X6vo;ghep-@&yOivYP zC19L0D`jjKy1Yi-SGPAn94(768Tcf$urAf{)1)9W58P`6MA{YG%O?|07!g9(b`8PXG1B1Sh0?HQmeJtP0M$O$hI z{5G`&9XzYhh|y@qsF1GnHN|~^ru~HVf#)lOTSrv=S@DyR$UKQk zjdEPFDz{uHM&UM;=mG!xKvp;xAGHOBo~>_=WFTmh$chpC7c`~7?36h)7$fF~Ii}8q zF|YXxH-Z?d+Q+27Rs3X9S&K3N+)OBxMHn1u(vlrUC6ckBY@@jl+mgr#KQUKo#VeFm zFwNYgv0<%~Wn}KeLeD9e1$S>jhOq&(e*I@L<=I5b(?G(zpqI*WBqf|Zge0&aoDUsC zngMRA_Kt0>La+Erl=Uv_J^p(z=!?XHpenzn$%EA`JIq#yYF?JLDMYiPfM(&Csr#f{ zdd+LJL1by?xz|D8+(fgzRs~(N1k9DSyK@LJygwaYX8dZl0W!I&c^K?7)z{2is;OkE zd$VK-(uH#AUaZrp=1z;O*n=b?QJkxu`Xsw&7yrX0?(CX=I-C#T;yi8a<{E~?vr3W> zQrpPqOW2M+AnZ&p{hqmHZU-;Q(7?- zP8L|Q0RM~sB0w1w53f&Kd*y}ofx@c z5Y6B8qGel+uT1JMot$nT1!Tim6{>oZzJXdyA+4euOLME?5Fd_85Uk%#E*ln%y{u8Q z$|?|R@Hpb~yTVK-Yr_S#%NUy7EBfYGAg>b({J|5b+j-PBpPy$Ns`PaJin4JdRfOaS zE|<HjH%NuJgsd2wOlv>~y=np%=2)$M9LS|>P)zJ+Fei5vYo_N~B0XCn+GM76 z)Xz3tg*FRVFgIl9zpESgdpWAavvVViGlU8|UFY{{gVJskg*I!ZjWyk~OW-Td4(mZ6 zB&SQreAAMqwp}rjy`HsG({l2&q5Y52<@AULVAu~rWI$UbFuZs>Sc*x+XI<+ez%$U)|a^unjpiW0l0 zj1!K0(b6$8LOjzRqQ~K&dfbMIE=TF}XFAi)$+h}5SD3lo z%%Qd>p9se=VtQG{kQ;N`sI)G^u|DN#7{aoEd zkksYP%_X$Rq08);-s6o>CGJ<}v`qs%eYf+J%DQ^2k68C%nvikRsN?$ap--f+vCS`K z#&~)f7!N^;sdUXu54gl3L=LN>FB^tuK=y2e#|hWiWUls__n@L|>xH{%8lIJTd5`w? zSwZbnS;W~DawT4OwSJVdAylbY+u5S+ZH{4hAi2&}Iv~W(UvHg(1GTZRPz`@{SOqzy z(8g&Dz=$PfRV=6FgxN~zo+G8OoPI&d-thcGVR*_^(R8COTM@bq?fDwY{}WhsQS1AK zF6R1t8!RdFmfocpJ6?9Yv~;WYi~XPgs(|>{5})j!AR!voO7y9&cMPo#80A(`za@t>cx<0;qxM@S*m(jYP)dMXr*?q0E`oL;12}VAep179uEr8c<=D zr5?A*C{eJ`z9Ee;E$8)MECqatHkbHH z&Y+ho0B$31MIB-xm&;xyaFCtg<{m~M-QDbY)fQ>Q*Xibb~8ytxZQ?QMf9!%cV zU0_X1@b4d+Pg#R!`OJ~DOrQz3@cpiGy~XSKjZQQ|^4J1puvwKeScrH8o{bscBsowomu z^f12kTvje`yEI3eEXDHJ6L+O{Jv$HVj%IKb|J{IvD*l6IG8WUgDJ*UGz z3!C%>?=dlfSJ>4U88)V+`U-!9r^@AxJBx8R;)J4Fn@`~k>8>v0M9xp90OJElWP&R5 zM#v*vtT}*Gm1^)Bv!s72T3PB0yVIjJW)H7a)ilkAvoaH?)jjb`MP>2z{%Y?}83 zUIwBKn`-MSg)=?R)1Q0z3b>dHE^)D8LFs}6ASG1|daDly_^lOSy&zIIhm*HXm1?VS=_iacG);_I9c zUQH1>i#*?oPIwBMJkzi_*>HoUe}_4o>2(SHWzqQ=;TyhAHS;Enr7!#8;sdlty&(>d zl%5cjri8`2X^Ds`jnw7>A`X|bl=U8n+3LKLy(1dAu8`g@9=5iw$R0qk)w8Vh_Dt^U zIglK}sn^)W7aB(Q>HvrX=rxB z+*L)3DiqpQ_%~|m=44LcD4-bxO3OO*LPjsh%p(k?&jvLp0py57oMH|*IMa(<|{m1(0S|x)?R-mqJ=I;_YUZA>J z62v*eSK;5w!h8J+6Z2~oyGdZ68waWfy09?4fU&m7%u~zi?YPHPgK6LDwphgaYu%0j zurtw)AYOpYKgHBrkX189mlJ`q)w-f|6>IER{5Lk97%P~a-JyCRFjejW@L>n4vt6#hq;!|m;hNE||LK3nw1{bJOy+eBJjK=QqNjI;Q6;Rp5 z&035pZDUZ#%Oa;&_7x0T<7!RW`#YBOj}F380Bq?MjjEhrvlCATPdkCTTl+2efTX$k zH&0zR1n^`C3ef~^sXzJK-)52(T}uTG%OF8yDhT76L~|^+hZ2hiSM*QA9*D5odI1>& z9kV9jC~twA5MwyOx(lsGD_ggYmztXPD`2=_V|ks_FOx!_J8!zM zTzh^cc+=VNZ&(OdN=y4Juw)@8-85lwf_#VMN!Ed(eQiRiLB2^2e`4dp286h@v@`O%_b)Y~A; zv}r6U?zs&@uD_+(_4bwoy7*uozNvp?bXFoB8?l8yG0qsm1JYzIvB_OH4_2G*IIOwT zVl%HX1562vLVcxM_RG*~w_`FbIc!(T=3>r528#%mwwMK}uEhJ()3MEby zQQjzqjWkwfI~;Fuj(Lj=Ug0y`>~C7`w&wzjK(rPw+Hpd~EvQ-ufQOiB4OMpyUKJhw zqEt~jle9d7S~LI~$6Z->J~QJ{Vdn3!c}g9}*KG^Kzr^(7VI5Gk(mHLL{itj_hG?&K4Ws0+T4gLfi3eu$N=`s36geNC?c zm!~}vG6lx9Uf^5M;bWntF<-{p^bruy~f?sk9 zcETAPQZLoJ8JzMMg<-=ju4keY@SY%Wo?u9Gx=j&dfa6LIAB|IrbORLV1-H==Z1zCM zeZcOYpm5>U2fU7V*h;%n`8 zN95QhfD994={1*<2vKLCNF)feKOGk`R#K~G=;rfq}|)s20&MCa65 zUM?xF5!&e0lF%|U!#rD@I{~OsS_?=;s_MQ_b_s=PuWdC)q|UQ&ea)DMRh5>fpQjXe z%9#*x=7{iRCtBKT#H>#v%>77|{4_slZ)XCY{s3j_r{tdpvb#|r|sbS^dU1x70$eJMU!h{Y7Kd{dl}9&vxQl6Jt1a` zHQZrWyY0?!vqf@u-fxU_@+}u(%Wm>0I#KP48tiAPYY!TdW(o|KtVI|EUB9V`CBBNaBLVih7+yMVF|GSoIQD0Jfb{ z!OXq;(>Z?O`1gap(L~bUcp>Lc@Jl-})^=6P%<~~9ywY=$iu8pJ0m*hOPzr~q`23eX zgbs;VOxxENe0UMVeN*>uCn9Gk!4siN-e>x)pIKAbQz!G)TcqIJ0`JBBaX>1-4_XO_-HCS^vr2vjv#7KltDZdyQ{tlWh4$Gm zB>|O1cBDC)yG(sbnc*@w6e%e}r*|IhpXckx&;sQCwGdKH+3oSG-2)Bf#x`@<4ETAr z0My%7RFh6ZLiZ_;X6Mu1YmXx7C$lSZ^}1h;j`EZd6@%JNUe=btBE z%s=Xmo1Ps?8G`}9+6>iaB8bgjUdXT?=trMu|4yLX^m0Dg{m7rpKNJey|EwHI+nN1e zL^>qN%5Fg)dGs4DO~uwIdXImN)QJ*Jhpj7$fq_^`{3fwpztL@WBB}OwQ#Epo-mqMO zsM$UgpFiG&d#)lzEQ{3Q;)&zTw;SzGOah-Dpm{!q7<8*)Ti_;xvV2TYXa}=faXZy? z3y?~GY@kl)>G&EvEijk9y1S`*=zBJSB1iet>0;x1Ai)*`^{pj0JMs)KAM=@UyOGtO z3y0BouW$N&TnwU6!%zS%nIrnANvZF&vB1~P5_d`x-giHuG zPJ;>XkVoghm#kZXRf>qxxEix;2;D1CC~NrbO6NBX!`&_$iXwP~P*c($EVV|669kDO zKoTLZNF4Cskh!Jz5ga9uZ`3o%7Pv`d^;a=cXI|>y;zC3rYPFLQkF*nv(r>SQvD*## z(Vo%^9g`%XwS0t#94zPq;mYGLKu4LU3;txF26?V~A0xZbU4Lmy`)>SoQX^m7fd^*E z+%{R4eN!rIk~K)M&UEzxp9dbY;_I^c} zOc{wlIrN_P(PPqi51k_$>Lt|X6A^|CGYgKAmoI#Li?;Wq%q~q*L7ehZkUrMxW67Jl zhsb~+U?33QS>eqyN{(odAkbopo=Q$Az?L+NZW>j;#~@wCDX?=L5SI|OxI~7!Pli;e zELMFcZtJY3!|=Gr2L4>z8yQ-{To>(f80*#;6`4IAiqUw`=Pg$%C?#1 z_g@hIGerILSU>=P>z{gM|DS91A4cT@PEIB^hSop!uhMo#2G;+tQSpDO_6nOnPWSLU zS;a9m^DFMXR4?*X=}d7l;nXuHk&0|m`NQn%d?8|Ab3A9l9Jh5s120ibWBdB z$5YwsK3;wvp!Kn@)Qae{ef`0#NwlRpQ}k^r>yos_Ne1;xyKLO?4)t_G4eK~wkUS2A&@_;)K0-03XGBzU+5f+uMDxC z(s8!8!RvdC#@`~fx$r)TKdLD6fWEVdEYtV#{ncT-ZMX~eI#UeQ-+H(Z43vVn%Yj9X zLdu9>o%wnWdvzA-#d6Z~vzj-}V3FQ5;axDIZ;i(95IIU=GQ4WuU{tl-{gk!5{l4_d zvvb&uE{%!iFwpymz{wh?bKr1*qzeZb5f6e6m_ozRF&zux2mlK=v_(_s^R6b5lu?_W4W3#<$zeG~Pd)^!4tzhs}-Sx$FJP>)ZGF(hVTH|C3(U zs0PO&*h_ zNA-&qZpTP$$LtIgfiCn07}XDbK#HIXdmv8zdz4TY;ifNIH-0jy(gMSByG2EF~Th#eb_TueZC` zE?3I>UTMpKQ})=C;6p!?G)M6w^u*A57bD?2X`m3X^6;&4%i_m(uGJ3Z5h`nwxM<)H z$I5m?wN>O~8`BGnZ=y^p6;0+%_0K}Dcg|K;+fEi|qoBqvHj(M&aHGqNF48~XqhtU? z^ogwBzRlOfpAJ+Rw7IED8lRbTdBdyEK$gPUpUG}j-M42xDj_&qEAQEtbs>D#dRd7Y z<&TpSZ(quQDHiCFn&0xsrz~4`4tz!CdL8m~HxZM_agu@IrBpyeL1Ft}V$HX_ZqDPm z-f89)pjuEzGdq-PRu`b1m+qBGY{zr_>{6Ss>F|xHZlJj9dt5HD$u`1*WZe)qEIuDSR)%z+|n zatVlhQ?$w#XRS7xUrFE;Y8vMGhQS5*T{ZnY=q1P?w5g$OKJ#M&e??tAmPWHMj3xhS ziGxapy?kn@$~2%ZY;M8Bc@%$pkl%Rvj!?o%agBvpQ-Q61n9kznC4ttrRNQ4%GFR5u zyv%Yo9~yxQJWJSfj z?#HY$y=O~F|2pZs22pu|_&Ajd+D(Mt!nPUG{|1nlvP`=R#kKH zO*s$r_%ss5h1YO7k0bHJ2CXN)Yd6CHn~W!R=SqkWe=&nAZu(Q1G!xgcUilM@YVei@2@a`8he z9@pM`)VB*=e7-MWgLlXlc)t;fF&-AwM{E-EX}pViFn0I0CNw2bNEnN2dj!^4(^zS3 zobUm1uQnpqk_4q{pl*n06=TfK_C>UgurKFjRXsK_LEn};=79`TB12tv6KzwSu*-C8 z;=~ohDLZylHQ|Mpx-?yql>|e=vI1Z!epyUpAcDCp4T|*RV&X`Q$0ogNwy6mFALo^@ z9=&(9txO8V@E!@6^(W0{*~CT>+-MA~vnJULBxCTUW>X5>r7*eXYUT0B6+w@lzw%n> z_VjJ<2qf|(d6jYq2(x$(ZDf!yVkfnbvNmb5c|hhZ^2TV_LBz`9w!e_V*W_(MiA7|= z&EeIIkw*+$Xd!)j8<@_<}A5;~A_>3JT*kX^@}cDoLd>Qj<`Se^wdUa(j0dp+Tl8EptwBm{9OGsdFEq zM`!pjf(Lm(`$e3FLOjqA5LnN5o!}z{ zNf}rJuZh@yUtq&ErjHeGzX4(!luV!jB&;FAP|!R_QHYw#^Z1LwTePAKJ6X&IDNO#; z)#I@Xnnzyij~C@UH~X51JCgQeF0&hTXnuoElz#m{heZRexWc0k4<>0+ClX7%0 zEBqCCld1tD9Zwkr4{?Nor19#E5-YKfB8d?qgR82-Ow2^AuNevly2*tHA|sK!ybYkX zm-sLQH72P&{vEAW6+z~O5d0qd=xW~rua~5a?ymYFSD@8&gV)E5@RNNBAj^C99+Z5Z zR@Pq55mbCQbz+Mn$d_CMW<-+?TU960agEk1J<>d>0K=pF19yN))a~4>m^G&tc*xR+yMD*S=yip-q=H zIlredHpsJV8H(32@Zxc@bX6a21dUV95Th--8pE6C&3F>pk=yv$yd6@Haw;$v4+Fcb zRwn{Qo@0`7aPa2LQOP}j9v>sjOo5Kqvn|`FLizX zB+@-u4Lw|jsvz{p^>n8Vo8H2peIqJJnMN}A)q6%$Tmig7eu^}K2 zrh$X?T|ZMsoh{6pdw1G$_T<`Ds-G=jc;qcGdK4{?dN2-XxjDNbb(7pk|3JUVCU4y; z)?LXR>f+AAu)JEiti_Zy#z5{RgsC}R(@jl%9YZ>zu~hKQ*AxbvhC378-I@{~#%Y`Z zy=a=9YpewPIC+gkEUUwtUL7|RU7=!^Aa}Mk^6uxOgRGA#JXjWLsjFUnix|Mau{hDT z7mn*z1m5g`vP(#tjT0Zy4eAY(br&!RiiXE=ZI!{sE1#^#%x^Z7t1U)b<;%Y}Q9=5v z;wpDCEZ@OE36TWT=|gxigT@VaW9BvHS05;_P(#s z8zI4XFQys}q)<`tkX$WnSarn{3e!s}4(J!=Yf>+Y>cP3f;vr63f2{|S^`_pWc)^5_!R z*(x-fuBxL51@xe!lnDBKi}Br$c$BMZ3%f2Sa6kLabiBS{pq*yj;q|k(86x`PiC{p6 z_bxCW{>Q2BA8~Ggz&0jkrcU+-$ANBsOop*ms>34K9lNYil@}jC;?cYP(m^P}nR6FV zk(M%48Z&%2Rx$A&FhOEirEhY0(dn;-k(qkTU)sFQ`+-ih+s@A8g?r8Pw+}2;35WYf zi}VO`jS`p(tc)$X$a>-#WXoW!phhatC*$}|rk>|wUU71eUJG^$c6_jwX?iSHM@6__ zvV|6%U*$sSXJu9SX?2%M^kK|}a2QJ8AhF{fuXrHZxXsI~O zGKX45!K7p*MCPEQ=gp?eu&#AW*pR{lhQR##P_*{c_DjMGL|3T3-bSJ(o$|M{ytU}> zAV>wq*uE*qFo9KvnA^@juy{x<-u*#2NvkV={Ly}ysKYB-k`K3@K#^S1Bb$8Y#0L0# z`6IkSG&|Z$ODy|VLS+y5pFJx&8tvPmMd8c9FhCyiU8~k6FwkakUd^(_ml8`rnl>JS zZV){9G*)xBqPz^LDqRwyS6w86#D^~xP4($150M)SOZRe9sn=>V#aG0Iy(_^YcPpIz8QYM-#s+n% z@Jd?xQq?Xk6=<3xSY7XYP$$yd&Spu{A#uafiIfy8gRC`o0nk{ezEDjb=q_qRAlR1d zFq^*9Gn)yTG4b}R{!+3hWQ+u3GT~8nwl2S1lpw`s0X_qpxv)g+JIkVKl${sYf_nV~B>Em>M;RlqGb5WVil(89 zs=ld@|#;dq1*vQGz=7--Br-|l) zZ%Xh@v8>B7P?~}?Cg$q9_={59l%m~O&*a6TKsCMAzG&vD>k2WDzJ6!tc!V)+oxF;h zJH;apM=wO?r_+*#;ulohuP=E>^zon}a$NnlcQ{1$SO*i=jnGVcQa^>QOILc)e6;eNTI>os=eaJ{*^DE+~jc zS}TYeOykDmJ=6O%>m`i*>&pO_S;qMySJIyP=}4E&J%#1zju$RpVAkZbEl+p%?ZP^C z*$$2b4t%a(e+%>a>d_f_<JjxI#J1x;=hPd1zFPx=6T$;;X1TD*2(edZ3f46zaAoW>L53vS_J*N8TMB|n+;LD| zC=GkQPpyDY#Am4l49chDv*gojhRj_?63&&8#doW`INATAo(qY#{q}%nf@eTIXmtU< zdB<7YWfyCmBs|c)cK>1)v&M#!yNj#4d$~pVfDWQc_ke1?fw{T1Nce_b`v|Vp5ig(H zJvRD^+ps46^hLX;=e2!2e;w9y1D@!D$c@Jc&%%%IL=+xzw55&2?darw=9g~>P z9>?Kdc$r?6c$m%x2S$sdpPl>GQZ{rC9mPS63*qjCVa?OIBj!fW zm|g?>CVfGXNjOfcyqImXR_(tXS(F{FcoNzKvG5R$IgGaxC@)i(e+$ME}vPVIhd|mx2IIE+f zM?9opQHIVgBWu)^A|RzXw!^??S!x)SZOwZaJkGjc<_}2l^eSBm!eAJG9T>EC6I_sy z?bxzDIAn&K5*mX)$RQzDA?s)-no-XF(g*yl4%+GBf`##bDXJ==AQk*xmnatI;SsLp zP9XTHq5mmS=iWu~9ES>b%Q=1aMa|ya^vj$@qz9S!ih{T8_PD%Sf_QrNKwgrXw9ldm zHRVR98*{C?_XNpJn{abA!oix_mowRMu^2lV-LPi;0+?-F(>^5#OHX-fPED zCu^l7u3E%STI}c4{J2!)9SUlGP_@!d?5W^QJXOI-Ea`hFMKjR7TluLvzC-ozCPn1`Tpy z!vlv@_Z58ILX6>nDjTp-1LlFMx~-%GA`aJvG$?8*Ihn;mH37eK**rmOEwqegf-Ccx zrIX4;{c~RK>XuTXxYo5kMiWMy)!IC{*DHG@E$hx?RwP@+wuad(P1{@%tRkyJRqD)3 zMHHHZ4boqDn>-=DgR5VlhQTpfVy182Gk;A_S8A1-;U1RR>+$62>(MUx@Nox$vTjHq z%QR=j!6Gdyb5wu7y(YUktwMuW5<@jl?m4cv4BODiT5o8qVdC0MBqGr@-YBIwnpZAY znX9(_uQjP}JJ=!~Ve9#5I~rUnN|P_3D$LqZcvBnywYhjlMSFHm`;u9GPla{5QD7(7*6Tb3Svr8;(nuAd81q$*uq6HC_&~je*Ca7hP4sJp0av{M8480wF zxASi7Qv+~@2U%Nu1Ud;s-G4CTVWIPyx!sg&8ZG0Wq zG_}i3C(6_1>q3w!EH7$Kwq8uBp2F2N7}l65mk1p*9v0&+;th=_E-W)E;w}P(j⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties index 774fae8767..878fe049c2 100644 --- a/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle-modules/gradle/gradle/shipkit.gradle b/gradle-modules/gradle/gradle/shipkit.gradle deleted file mode 100644 index 144c01dc05..0000000000 --- a/gradle-modules/gradle/gradle/shipkit.gradle +++ /dev/null @@ -1,41 +0,0 @@ -//This default Shipkit configuration file was created automatically and is intended to be checked-in. -//Default configuration is sufficient for local testing and trying out Shipkit. -//To leverage Shipkit fully, please fix the TODO items, refer to our Getting Started Guide for help: -// -// https://github.com/mockito/shipkit/blob/master/docs/getting-started.md -// -shipkit { - //TODO is the repository correct? - gitHub.repository = "unspecified-user/unspecified-repo" - - //TODO generate and use your own read-only GitHub personal access token - gitHub.readOnlyAuthToken = "76826c9ec886612f504d12fd4268b16721c4f85d" - - //TODO generate GitHub write token, and ensure your Travis CI has this env variable exported - gitHub.writeAuthToken = System.getenv("GH_WRITE_TOKEN") -} - -allprojects { - plugins.withId("com.jfrog.bintray") { - - //Bintray configuration is handled by JFrog Bintray Gradle Plugin - //For reference see the official documentation: https://github.com/bintray/gradle-bintray-plugin - bintray { - - //TODO sign up for free open source account with https://bintray.com, then look up your API key on your profile page in Bintray - key = '7ea297848ca948adb7d3ee92a83292112d7ae989' - //TODO don't check in the key, remove above line and use env variable exported on CI: - //key = System.getenv("BINTRAY_API_KEY") - - pkg { - //TODO configure Bintray settings per your project (https://github.com/bintray/gradle-bintray-plugin) - repo = 'bootstrap' - user = 'shipkit-bootstrap-bot' - userOrg = 'shipkit-bootstrap' - name = 'maven' - licenses = ['MIT'] - labels = ['continuous delivery', 'release automation', 'shipkit'] - } - } - } -} diff --git a/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 zcmb5Wb9gP!wgnp7wrv|bwr$&XvSZt}Z6`anZSUAlc9NHKf9JdJ;NJVr`=eI(_pMp0 zy1VAAG3FfAOI`{X1O)&90s;U4K;XLp008~hCjbEC_fbYfS%6kTR+JtXK>nW$ZR+`W ze|#J8f4A@M|F5BpfUJb5h>|j$jOe}0oE!`Zf6fM>CR?!y@zU(cL8NsKk`a z6tx5mAkdjD;J=LcJ;;Aw8p!v#ouk>mUDZF@ zK>yvw%+bKu+T{Nk@LZ;zkYy0HBKw06_IWcMHo*0HKpTsEFZhn5qCHH9j z)|XpN&{`!0a>Vl+PmdQc)Yg4A(AG-z!+@Q#eHr&g<9D?7E)_aEB?s_rx>UE9TUq|? z;(ggJt>9l?C|zoO@5)tu?EV0x_7T17q4fF-q3{yZ^ipUbKcRZ4Qftd!xO(#UGhb2y>?*@{xq%`(-`2T^vc=#< zx!+@4pRdk&*1ht2OWk^Z5IAQ0YTAXLkL{(D*$gENaD)7A%^XXrCchN&z2x+*>o2FwPFjWpeaL=!tzv#JOW#( z$B)Nel<+$bkH1KZv3&-}=SiG~w2sbDbAWarg%5>YbC|}*d9hBjBkR(@tyM0T)FO$# zPtRXukGPnOd)~z=?avu+4Co@wF}1T)-uh5jI<1$HLtyDrVak{gw`mcH@Q-@wg{v^c zRzu}hMKFHV<8w}o*yg6p@Sq%=gkd~;`_VGTS?L@yVu`xuGy+dH6YOwcP6ZE`_0rK% zAx5!FjDuss`FQ3eF|mhrWkjux(Pny^k$u_)dyCSEbAsecHsq#8B3n3kDU(zW5yE|( zgc>sFQywFj5}U*qtF9Y(bi*;>B7WJykcAXF86@)z|0-Vm@jt!EPoLA6>r)?@DIobIZ5Sx zsc@OC{b|3%vaMbyeM|O^UxEYlEMHK4r)V-{r)_yz`w1*xV0|lh-LQOP`OP`Pk1aW( z8DSlGN>Ts|n*xj+%If~+E_BxK)~5T#w6Q1WEKt{!Xtbd`J;`2a>8boRo;7u2M&iOop4qcy<)z023=oghSFV zST;?S;ye+dRQe>ygiJ6HCv4;~3DHtJ({fWeE~$H@mKn@Oh6Z(_sO>01JwH5oA4nvK zr5Sr^g+LC zLt(i&ecdmqsIJGNOSUyUpglvhhrY8lGkzO=0USEKNL%8zHshS>Qziu|`eyWP^5xL4 zRP122_dCJl>hZc~?58w~>`P_s18VoU|7(|Eit0-lZRgLTZKNq5{k zE?V=`7=R&ro(X%LTS*f+#H-mGo_j3dm@F_krAYegDLk6UV{`UKE;{YSsn$ z(yz{v1@p|p!0>g04!eRSrSVb>MQYPr8_MA|MpoGzqyd*$@4j|)cD_%^Hrd>SorF>@ zBX+V<@vEB5PRLGR(uP9&U&5=(HVc?6B58NJT_igiAH*q~Wb`dDZpJSKfy5#Aag4IX zj~uv74EQ_Q_1qaXWI!7Vf@ZrdUhZFE;L&P_Xr8l@GMkhc#=plV0+g(ki>+7fO%?Jb zl+bTy7q{w^pTb{>(Xf2q1BVdq?#f=!geqssXp z4pMu*q;iiHmA*IjOj4`4S&|8@gSw*^{|PT}Aw~}ZXU`6=vZB=GGeMm}V6W46|pU&58~P+?LUs%n@J}CSrICkeng6YJ^M? zS(W?K4nOtoBe4tvBXs@@`i?4G$S2W&;$z8VBSM;Mn9 zxcaEiQ9=vS|bIJ>*tf9AH~m&U%2+Dim<)E=}KORp+cZ^!@wI`h1NVBXu{@%hB2Cq(dXx_aQ9x3mr*fwL5!ZryQqi|KFJuzvP zK1)nrKZ7U+B{1ZmJub?4)Ln^J6k!i0t~VO#=q1{?T)%OV?MN}k5M{}vjyZu#M0_*u z8jwZKJ#Df~1jcLXZL7bnCEhB6IzQZ-GcoQJ!16I*39iazoVGugcKA{lhiHg4Ta2fD zk1Utyc5%QzZ$s3;p0N+N8VX{sd!~l*Ta3|t>lhI&G`sr6L~G5Lul`>m z{!^INm?J|&7X=;{XveF!(b*=?9NAp4y&r&N3(GKcW4rS(Ejk|Lzs1PrxPI_owB-`H zg3(Rruh^&)`TKA6+_!n>RdI6pw>Vt1_j&+bKIaMTYLiqhZ#y_=J8`TK{Jd<7l9&sY z^^`hmi7^14s16B6)1O;vJWOF$=$B5ONW;;2&|pUvJlmeUS&F;DbSHCrEb0QBDR|my zIs+pE0Y^`qJTyH-_mP=)Y+u^LHcuZhsM3+P||?+W#V!_6E-8boP#R-*na4!o-Q1 zVthtYhK{mDhF(&7Okzo9dTi03X(AE{8cH$JIg%MEQca`S zy@8{Fjft~~BdzWC(di#X{ny;!yYGK9b@=b|zcKZ{vv4D8i+`ilOPl;PJl{!&5-0!w z^fOl#|}vVg%=n)@_e1BrP)`A zKPgs`O0EO}Y2KWLuo`iGaKu1k#YR6BMySxQf2V++Wo{6EHmK>A~Q5o73yM z-RbxC7Qdh0Cz!nG+7BRZE>~FLI-?&W_rJUl-8FDIaXoNBL)@1hwKa^wOr1($*5h~T zF;%f^%<$p8Y_yu(JEg=c_O!aZ#)Gjh$n(hfJAp$C2he555W5zdrBqjFmo|VY+el;o z=*D_w|GXG|p0**hQ7~9-n|y5k%B}TAF0iarDM!q-jYbR^us(>&y;n^2l0C%@2B}KM zyeRT9)oMt97Agvc4sEKUEy%MpXr2vz*lb zh*L}}iG>-pqDRw7ud{=FvTD?}xjD)w{`KzjNom-$jS^;iw0+7nXSnt1R@G|VqoRhE%12nm+PH?9`(4rM0kfrZzIK9JU=^$YNyLvAIoxl#Q)xxDz!^0@zZ zSCs$nfcxK_vRYM34O<1}QHZ|hp4`ioX3x8(UV(FU$J@o%tw3t4k1QPmlEpZa2IujG&(roX_q*%e`Hq|);0;@k z0z=fZiFckp#JzW0p+2A+D$PC~IsakhJJkG(c;CqAgFfU0Z`u$PzG~-9I1oPHrCw&)@s^Dc~^)#HPW0Ra}J^=|h7Fs*<8|b13ZzG6MP*Q1dkoZ6&A^!}|hbjM{2HpqlSXv_UUg1U4gn z3Q)2VjU^ti1myodv+tjhSZp%D978m~p& z43uZUrraHs80Mq&vcetqfQpQP?m!CFj)44t8Z}k`E798wxg&~aCm+DBoI+nKq}&j^ zlPY3W$)K;KtEajks1`G?-@me7C>{PiiBu+41#yU_c(dITaqE?IQ(DBu+c^Ux!>pCj zLC|HJGU*v+!it1(;3e`6igkH(VA)-S+k(*yqxMgUah3$@C zz`7hEM47xr>j8^g`%*f=6S5n>z%Bt_Fg{Tvmr+MIsCx=0gsu_sF`q2hlkEmisz#Fy zj_0;zUWr;Gz}$BS%Y`meb(=$d%@Crs(OoJ|}m#<7=-A~PQbyN$x%2iXP2@e*nO0b7AwfH8cCUa*Wfu@b)D_>I*%uE4O3 z(lfnB`-Xf*LfC)E}e?%X2kK7DItK6Tf<+M^mX0Ijf_!IP>7c8IZX%8_#0060P{QMuV^B9i<^E`_Qf0pv9(P%_s8D`qvDE9LK9u-jB}J2S`(mCO&XHTS04Z5Ez*vl^T%!^$~EH8M-UdwhegL>3IQ*)(MtuH2Xt1p!fS4o~*rR?WLxlA!sjc2(O znjJn~wQ!Fp9s2e^IWP1C<4%sFF}T4omr}7+4asciyo3DntTgWIzhQpQirM$9{EbQd z3jz9vS@{aOqTQHI|l#aUV@2Q^Wko4T0T04Me4!2nsdrA8QY1%fnAYb~d2GDz@lAtfcHq(P7 zaMBAGo}+NcE-K*@9y;Vt3*(aCaMKXBB*BJcD_Qnxpt75r?GeAQ}*|>pYJE=uZb73 zC>sv)18)q#EGrTG6io*}JLuB_jP3AU1Uiu$D7r|2_zlIGb9 zjhst#ni)Y`$)!fc#reM*$~iaYoz~_Cy7J3ZTiPm)E?%`fbk`3Tu-F#`{i!l5pNEn5 zO-Tw-=TojYhzT{J=?SZj=Z8#|eoF>434b-DXiUsignxXNaR3 zm_}4iWU$gt2Mw5NvZ5(VpF`?X*f2UZDs1TEa1oZCif?Jdgr{>O~7}-$|BZ7I(IKW`{f;@|IZFX*R8&iT= zoWstN8&R;}@2Ka%d3vrLtR|O??ben;k8QbS-WB0VgiCz;<$pBmIZdN!aalyCSEm)crpS9dcD^Y@XT1a3+zpi-`D}e#HV<} z$Y(G&o~PvL-xSVD5D?JqF3?B9rxGWeb=oEGJ3vRp5xfBPlngh1O$yI95EL+T8{GC@ z98i1H9KhZGFl|;`)_=QpM6H?eDPpw~^(aFQWwyXZ8_EEE4#@QeT_URray*mEOGsGc z6|sdXtq!hVZo=d#+9^@lm&L5|q&-GDCyUx#YQiccq;spOBe3V+VKdjJA=IL=Zn%P} zNk=_8u}VhzFf{UYZV0`lUwcD&)9AFx0@Fc6LD9A6Rd1=ga>Mi0)_QxM2ddCVRmZ0d z+J=uXc(?5JLX3=)e)Jm$HS2yF`44IKhwRnm2*669_J=2LlwuF5$1tAo@ROSU@-y+;Foy2IEl2^V1N;fk~YR z?&EP8#t&m0B=?aJeuz~lHjAzRBX>&x=A;gIvb>MD{XEV zV%l-+9N-)i;YH%nKP?>f`=?#`>B(`*t`aiPLoQM(a6(qs4p5KFjDBN?8JGrf3z8>= zi7sD)c)Nm~x{e<^jy4nTx${P~cwz_*a>%0_;ULou3kHCAD7EYkw@l$8TN#LO9jC( z1BeFW`k+bu5e8Ns^a8dPcjEVHM;r6UX+cN=Uy7HU)j-myRU0wHd$A1fNI~`4;I~`zC)3ul#8#^rXVSO*m}Ag>c%_;nj=Nv$rCZ z*~L@C@OZg%Q^m)lc-kcX&a*a5`y&DaRxh6O*dfhLfF+fU5wKs(1v*!TkZidw*)YBP za@r`3+^IHRFeO%!ai%rxy;R;;V^Fr=OJlpBX;(b*3+SIw}7= zIq$*Thr(Zft-RlY)D3e8V;BmD&HOfX+E$H#Y@B3?UL5L~_fA-@*IB-!gItK7PIgG9 zgWuGZK_nuZjHVT_Fv(XxtU%)58;W39vzTI2n&)&4Dmq7&JX6G>XFaAR{7_3QB6zsT z?$L8c*WdN~nZGiscY%5KljQARN;`w$gho=p006z;n(qIQ*Zu<``TMO3n0{ARL@gYh zoRwS*|Niw~cR!?hE{m*y@F`1)vx-JRfqET=dJ5_(076st(=lFfjtKHoYg`k3oNmo_ zNbQEw8&sO5jAYmkD|Zaz_yUb0rC})U!rCHOl}JhbYIDLzLvrZVw0~JO`d*6f;X&?V=#T@ND*cv^I;`sFeq4 z##H5;gpZTb^0Hz@3C*~u0AqqNZ-r%rN3KD~%Gw`0XsIq$(^MEb<~H(2*5G^<2(*aI z%7}WB+TRlMIrEK#s0 z93xn*Ohb=kWFc)BNHG4I(~RPn-R8#0lqyBBz5OM6o5|>x9LK@%HaM}}Y5goCQRt2C z{j*2TtT4ne!Z}vh89mjwiSXG=%DURar~=kGNNaO_+Nkb+tRi~Rkf!7a$*QlavziD( z83s4GmQ^Wf*0Bd04f#0HX@ua_d8 z23~z*53ePD6@xwZ(vdl0DLc=>cPIOPOdca&MyR^jhhKrdQO?_jJh`xV3GKz&2lvP8 zEOwW6L*ufvK;TN{=S&R@pzV^U=QNk^Ec}5H z+2~JvEVA{`uMAr)?Kf|aW>33`)UL@bnfIUQc~L;TsTQ6>r-<^rB8uoNOJ>HWgqMI8 zSW}pZmp_;z_2O5_RD|fGyTxaxk53Hg_3Khc<8AUzV|ZeK{fp|Ne933=1&_^Dbv5^u zB9n=*)k*tjHDRJ@$bp9mrh}qFn*s}npMl5BMDC%Hs0M0g-hW~P*3CNG06G!MOPEQ_ zi}Qs-6M8aMt;sL$vlmVBR^+Ry<64jrm1EI1%#j?c?4b*7>)a{aDw#TfTYKq+SjEFA z(aJ&z_0?0JB83D-i3Vh+o|XV4UP+YJ$9Boid2^M2en@APw&wx7vU~t$r2V`F|7Qfo z>WKgI@eNBZ-+Og<{u2ZiG%>YvH2L3fNpV9J;WLJoBZda)01Rn;o@){01{7E#ke(7U zHK>S#qZ(N=aoae*4X!0A{)nu0R_sKpi1{)u>GVjC+b5Jyl6#AoQ-1_3UDovNSo`T> z?c-@7XX*2GMy?k?{g)7?Sv;SJkmxYPJPs!&QqB12ejq`Lee^-cDveVWL^CTUldb(G zjDGe(O4P=S{4fF=#~oAu>LG>wrU^z_?3yt24FOx>}{^lCGh8?vtvY$^hbZ)9I0E3r3NOlb9I?F-Yc=r$*~l`4N^xzlV~N zl~#oc>U)Yjl0BxV>O*Kr@lKT{Z09OXt2GlvE38nfs+DD7exl|&vT;)>VFXJVZp9Np zDK}aO;R3~ag$X*|hRVY3OPax|PG`@_ESc8E!mHRByJbZQRS38V2F__7MW~sgh!a>98Q2%lUNFO=^xU52|?D=IK#QjwBky-C>zOWlsiiM&1n z;!&1((Xn1$9K}xabq~222gYvx3hnZPg}VMF_GV~5ocE=-v>V=T&RsLBo&`)DOyIj* zLV{h)JU_y*7SdRtDajP_Y+rBkNN*1_TXiKwHH2&p51d(#zv~s#HwbNy?<+(=9WBvo zw2hkk2Dj%kTFhY+$T+W-b7@qD!bkfN#Z2ng@Pd=i3-i?xYfs5Z*1hO?kd7Sp^9`;Y zM2jeGg<-nJD1er@Pc_cSY7wo5dzQX44=%6rn}P_SRbpzsA{6B+!$3B0#;}qwO37G^ zL(V_5JK`XT?OHVk|{_$vQ|oNEpab*BO4F zUTNQ7RUhnRsU`TK#~`)$icsvKh~(pl=3p6m98@k3P#~upd=k*u20SNcb{l^1rUa)>qO997)pYRWMncC8A&&MHlbW?7i^7M`+B$hH~Y|J zd>FYOGQ;j>Zc2e7R{KK7)0>>nn_jYJy&o@sK!4G>-rLKM8Hv)f;hi1D2fAc$+six2 zyVZ@wZ6x|fJ!4KrpCJY=!Mq0;)X)OoS~{Lkh6u8J`eK%u0WtKh6B>GW_)PVc zl}-k`p09qwGtZ@VbYJC!>29V?Dr>>vk?)o(x?!z*9DJ||9qG-&G~#kXxbw{KKYy}J zQKa-dPt~M~E}V?PhW0R26xdA%1T*%ra6SguGu50YHngOTIv)@N|YttEXo#OZfgtP7;H?EeZZxo<}3YlYxtBq znJ!WFR^tmGf0Py}N?kZ(#=VtpC@%xJkDmfcCoBTxq zr_|5gP?u1@vJZbxPZ|G0AW4=tpb84gM2DpJU||(b8kMOV1S3|(yuwZJ&rIiFW(U;5 zUtAW`O6F6Zy+eZ1EDuP~AAHlSY-+A_eI5Gx)%*uro5tljy}kCZU*_d7)oJ>oQSZ3* zneTn`{gnNC&uJd)0aMBzAg021?YJ~b(fmkwZAd696a=0NzBAqBN54KuNDwa*no(^O z6p05bioXUR^uXjpTol*ppHp%1v9e)vkoUAUJyBx3lw0UO39b0?^{}yb!$yca(@DUn zCquRF?t=Zb9`Ed3AI6|L{eX~ijVH`VzSMheKoP7LSSf4g>md>`yi!TkoG5P>Ofp+n z(v~rW+(5L96L{vBb^g51B=(o)?%%xhvT*A5btOpw(TKh^g^4c zw>0%X!_0`{iN%RbVk+A^f{w-4-SSf*fu@FhruNL##F~sF24O~u zyYF<3el2b$$wZ_|uW#@Ak+VAGk#e|kS8nL1g>2B-SNMjMp^8;-FfeofY2fphFHO!{ z*!o4oTb{4e;S<|JEs<1_hPsmAlVNk?_5-Fp5KKU&d#FiNW~Y+pVFk@Cua1I{T+1|+ zHx6rFMor)7L)krbilqsWwy@T+g3DiH5MyVf8Wy}XbEaoFIDr~y;@r&I>FMW{ z?Q+(IgyebZ)-i4jNoXQhq4Muy9Fv+OxU;9_Jmn+<`mEC#%2Q_2bpcgzcinygNI!&^ z=V$)o2&Yz04~+&pPWWn`rrWxJ&}8khR)6B(--!9Q zubo}h+1T)>a@c)H^i``@<^j?|r4*{;tQf78(xn0g39IoZw0(CwY1f<%F>kEaJ zp9u|IeMY5mRdAlw*+gSN^5$Q)ShM<~E=(c8QM+T-Qk)FyKz#Sw0EJ*edYcuOtO#~Cx^(M7w5 z3)rl#L)rF|(Vun2LkFr!rg8Q@=r>9p>(t3Gf_auiJ2Xx9HmxYTa|=MH_SUlYL`mz9 zTTS$`%;D-|Jt}AP1&k7PcnfFNTH0A-*FmxstjBDiZX?}%u%Yq94$fUT&z6od+(Uk> zuqsld#G(b$G8tus=M!N#oPd|PVFX)?M?tCD0tS%2IGTfh}3YA3f&UM)W$_GNV8 zQo+a(ml2Km4o6O%gKTCSDNq+#zCTIQ1*`TIJh~k6Gp;htHBFnne))rlFdGqwC6dx2+La1&Mnko*352k0y z+tQcwndQlX`nc6nb$A9?<-o|r*%aWXV#=6PQic0Ok_D;q>wbv&j7cKc!w4~KF#-{6 z(S%6Za)WpGIWf7jZ3svNG5OLs0>vCL9{V7cgO%zevIVMH{WgP*^D9ws&OqA{yr|m| zKD4*07dGXshJHd#e%x%J+qmS^lS|0Bp?{drv;{@{l9ArPO&?Q5=?OO9=}h$oVe#3b z3Yofj&Cb}WC$PxmRRS)H%&$1-)z7jELS}!u!zQ?A^Y{Tv4QVt*vd@uj-^t2fYRzQj zfxGR>-q|o$3sGn^#VzZ!QQx?h9`njeJry}@x?|k0-GTTA4y3t2E`3DZ!A~D?GiJup z)8%PK2^9OVRlP(24P^4_<|D=H^7}WlWu#LgsdHzB%cPy|f8dD3|A^mh4WXxhLTVu_ z@abE{6Saz|Y{rXYPd4$tfPYo}ef(oQWZ=4Bct-=_9`#Qgp4ma$n$`tOwq#&E18$B; z@Bp)bn3&rEi0>fWWZ@7k5WazfoX`SCO4jQWwVuo+$PmSZn^Hz?O(-tW@*DGxuf)V1 zO_xm&;NVCaHD4dqt(-MlszI3F-p?0!-e$fbiCeuaw66h^TTDLWuaV<@C-`=Xe5WL) zwooG7h>4&*)p3pKMS3O!4>-4jQUN}iAMQ)2*70?hP~)TzzR?-f@?Aqy$$1Iy8VGG$ zMM?8;j!pUX7QQD$gRc_#+=raAS577ga-w?jd`vCiN5lu)dEUkkUPl9!?{$IJNxQys z*E4e$eF&n&+AMRQR2gcaFEjAy*r)G!s(P6D&TfoApMFC_*Ftx0|D0@E-=B7tezU@d zZ{hGiN;YLIoSeRS;9o%dEua4b%4R3;$SugDjP$x;Z!M!@QibuSBb)HY!3zJ7M;^jw zlx6AD50FD&p3JyP*>o+t9YWW8(7P2t!VQQ21pHJOcG_SXQD;(5aX#M6x##5H_Re>6lPyDCjxr*R(+HE%c&QN+b^tbT zXBJk?p)zhJj#I?&Y2n&~XiytG9!1ox;bw5Rbj~)7c(MFBb4>IiRATdhg zmiEFlj@S_hwYYI(ki{}&<;_7(Z0Qkfq>am z&LtL=2qc7rWguk3BtE4zL41@#S;NN*-jWw|7Kx7H7~_%7fPt;TIX}Ubo>;Rmj94V> zNB1=;-9AR7s`Pxn}t_6^3ahlq53e&!Lh85uG zec0vJY_6e`tg7LgfrJ3k!DjR)Bi#L@DHIrZ`sK=<5O0Ip!fxGf*OgGSpP@Hbbe&$9 z;ZI}8lEoC2_7;%L2=w?tb%1oL0V+=Z`7b=P&lNGY;yVBazXRYu;+cQDKvm*7NCxu&i;zub zAJh#11%?w>E2rf2e~C4+rAb-&$^vsdACs7 z@|Ra!OfVM(ke{vyiqh7puf&Yp6cd6{DptUteYfIRWG3pI+5< zBVBI_xkBAc<(pcb$!Y%dTW(b;B;2pOI-(QCsLv@U-D1XJ z(Gk8Q3l7Ws46Aktuj>|s{$6zA&xCPuXL-kB`CgYMs}4IeyG*P51IDwW?8UNQd+$i~ zlxOPtSi5L|gJcF@DwmJA5Ju8HEJ>o{{upwIpb!f{2(vLNBw`7xMbvcw<^{Fj@E~1( z?w`iIMieunS#>nXlmUcSMU+D3rX28f?s7z;X=se6bo8;5vM|O^(D6{A9*ChnGH!RG zP##3>LDC3jZPE4PH32AxrqPk|yIIrq~`aL-=}`okhNu9aT%q z1b)7iJ)CN=V#Ly84N_r7U^SH2FGdE5FpTO2 z630TF$P>GNMu8`rOytb(lB2};`;P4YNwW1<5d3Q~AX#P0aX}R2b2)`rgkp#zTxcGj zAV^cvFbhP|JgWrq_e`~exr~sIR$6p5V?o4Wym3kQ3HA+;Pr$bQ0(PmADVO%MKL!^q z?zAM8j1l4jrq|5X+V!8S*2Wl@=7*pPgciTVK6kS1Ge zMsd_u6DFK$jTnvVtE;qa+8(1sGBu~n&F%dh(&c(Zs4Fc#A=gG^^%^AyH}1^?|8quj zl@Z47h$){PlELJgYZCIHHL= z{U8O>Tw4x3<1{?$8>k-P<}1y9DmAZP_;(3Y*{Sk^H^A=_iSJ@+s5ktgwTXz_2$~W9>VVZsfwCm@s0sQ zeB50_yu@uS+e7QoPvdCwDz{prjo(AFwR%C?z`EL{1`|coJHQTk^nX=tvs1<0arUOJ z!^`*x&&BvTYmemyZ)2p~{%eYX=JVR?DYr(rNgqRMA5E1PR1Iw=prk=L2ldy3r3Vg@27IZx43+ywyzr-X*p*d@tZV+!U#~$-q=8c zgdSuh#r?b4GhEGNai)ayHQpk>5(%j5c@C1K3(W1pb~HeHpaqijJZa-e6vq_8t-^M^ zBJxq|MqZc?pjXPIH}70a5vt!IUh;l}<>VX<-Qcv^u@5(@@M2CHSe_hD$VG-eiV^V( zj7*9T0?di?P$FaD6oo?)<)QT>Npf6Og!GO^GmPV(Km0!=+dE&bk#SNI+C9RGQ|{~O*VC+tXK3!n`5 zHfl6>lwf_aEVV3`0T!aHNZLsj$paS$=LL(?b!Czaa5bbSuZ6#$_@LK<(7yrrl+80| z{tOFd=|ta2Z`^ssozD9BINn45NxUeCQis?-BKmU*Kt=FY-NJ+)8S1ecuFtN-M?&42 zl2$G>u!iNhAk*HoJ^4v^9#ORYp5t^wDj6|lx~5w45#E5wVqI1JQ~9l?nPp1YINf++ zMAdSif~_ETv@Er(EFBI^@L4BULFW>)NI+ejHFP*T}UhWNN`I)RRS8za? z*@`1>9ZB}An%aT5K=_2iQmfE;GcBVHLF!$`I99o5GO`O%O_zLr9AG18>&^HkG(;=V z%}c!OBQ~?MX(9h~tajX{=x)+!cbM7$YzTlmsPOdp2L-?GoW`@{lY9U3f;OUo*BwRB z8A+nv(br0-SH#VxGy#ZrgnGD(=@;HME;yd46EgWJ`EL%oXc&lFpc@Y}^>G(W>h_v_ zlN!`idhX+OjL+~T?19sroAFVGfa5tX-D49w$1g2g_-T|EpHL6}K_aX4$K=LTvwtlF zL*z}j{f+Uoe7{-px3_5iKPA<_7W=>Izkk)!l9ez2w%vi(?Y;i8AxRNLSOGDzNoqoI zP!1uAl}r=_871(G?y`i&)-7{u=%nxk7CZ_Qh#!|ITec zwQn`33GTUM`;D2POWnkqngqJhJRlM>CTONzTG}>^Q0wUunQyn|TAiHzyX2_%ATx%P z%7gW)%4rA9^)M<_%k@`Y?RbC<29sWU&5;@|9thf2#zf8z12$hRcZ!CSb>kUp=4N#y zl3hE#y6>kkA8VY2`W`g5Ip?2qC_BY$>R`iGQLhz2-S>x(RuWv)SPaGdl^)gGw7tjR zH@;jwk!jIaCgSg_*9iF|a);sRUTq30(8I(obh^|}S~}P4U^BIGYqcz;MPpC~Y@k_m zaw4WG1_vz2GdCAX!$_a%GHK**@IrHSkGoN>)e}>yzUTm52on`hYot7cB=oA-h1u|R ztH$11t?54Qg2L+i33FPFKKRm1aOjKST{l1*(nps`>sv%VqeVMWjl5+Gh+9);hIP8? zA@$?}Sc z3qIRpba+y5yf{R6G(u8Z^vkg0Fu&D-7?1s=QZU`Ub{-!Y`I?AGf1VNuc^L3v>)>i# z{DV9W$)>34wnzAXUiV^ZpYKw>UElrN_5Xj6{r_3| z$X5PK`e5$7>~9Dj7gK5ash(dvs`vwfk}&RD`>04;j62zoXESkFBklYaKm5seyiX(P zqQ-;XxlV*yg?Dhlx%xt!b0N3GHp@(p$A;8|%# zZ5m2KL|{on4nr>2_s9Yh=r5ScQ0;aMF)G$-9-Ca6%wA`Pa)i?NGFA|#Yi?{X-4ZO_ z^}%7%vkzvUHa$-^Y#aA+aiR5sa%S|Ebyn`EV<3Pc?ax_f>@sBZF1S;7y$CXd5t5=WGsTKBk8$OfH4v|0?0I=Yp}7c=WBSCg!{0n)XmiU;lfx)**zZaYqmDJelxk$)nZyx5`x$6R|fz(;u zEje5Dtm|a%zK!!tk3{i9$I2b{vXNFy%Bf{50X!x{98+BsDr_u9i>G5%*sqEX|06J0 z^IY{UcEbj6LDwuMh7cH`H@9sVt1l1#8kEQ(LyT@&+K}(ReE`ux8gb0r6L_#bDUo^P z3Ka2lRo52Hdtl_%+pwVs14=q`{d^L58PsU@AMf(hENumaxM{7iAT5sYmWh@hQCO^ zK&}ijo=`VqZ#a3vE?`7QW0ZREL17ZvDfdqKGD?0D4fg{7v%|Yj&_jcKJAB)>=*RS* zto8p6@k%;&^ZF>hvXm&$PCuEp{uqw3VPG$9VMdW5$w-fy2CNNT>E;>ejBgy-m_6`& z97L1p{%srn@O_JQgFpa_#f(_)eb#YS>o>q3(*uB;uZb605(iqM$=NK{nHY=+X2*G) zO3-_Xh%aG}fHWe*==58zBwp%&`mge<8uq8;xIxOd=P%9EK!34^E9sk|(Zq1QSz-JVeP12Fp)-`F|KY$LPwUE?rku zY@OJ)Z9A!ojfzfeyJ9;zv2EM7ZQB)AR5xGa-tMn^bl)FmoIiVyJ@!~@%{}qXXD&Ns zPnfe5U+&ohKefILu_1mPfLGuapX@btta5C#gPB2cjk5m4T}Nfi+Vfka!Yd(L?-c~5 z#ZK4VeQEXNPc4r$K00Fg>g#_W!YZ)cJ?JTS<&68_$#cZT-ME`}tcwqg3#``3M3UPvn+pi}(VNNx6y zFIMVb6OwYU(2`at$gHba*qrMVUl8xk5z-z~fb@Q3Y_+aXuEKH}L+>eW__!IAd@V}L zkw#s%H0v2k5-=vh$^vPCuAi22Luu3uKTf6fPo?*nvj$9(u)4$6tvF-%IM+3pt*cgs z_?wW}J7VAA{_~!?))?s6{M=KPpVhg4fNuU*|3THp@_(q!b*hdl{fjRVFWtu^1dV(f z6iOux9hi&+UK=|%M*~|aqFK{Urfl!TA}UWY#`w(0P!KMe1Si{8|o))Gy6d7;!JQYhgMYmXl?3FfOM2nQGN@~Ap6(G z3+d_5y@=nkpKAhRqf{qQ~k7Z$v&l&@m7Ppt#FSNzKPZM z8LhihcE6i=<(#87E|Wr~HKvVWhkll4iSK$^mUHaxgy8*K$_Zj;zJ`L$naPj+^3zTi z-3NTaaKnD5FPY-~?Tq6QHnmDDRxu0mh0D|zD~Y=vv_qig5r-cIbCpxlju&8Sya)@{ zsmv6XUSi)@(?PvItkiZEeN*)AE~I_?#+Ja-r8$(XiXei2d@Hi7Rx8+rZZb?ZLa{;@*EHeRQ-YDadz~M*YCM4&F-r;E#M+@CSJMJ0oU|PQ^ z=E!HBJDMQ2TN*Y(Ag(ynAL8%^v;=~q?s4plA_hig&5Z0x_^Oab!T)@6kRN$)qEJ6E zNuQjg|G7iwU(N8pI@_6==0CL;lRh1dQF#wePhmu@hADFd3B5KIH#dx(2A zp~K&;Xw}F_N6CU~0)QpQk7s$a+LcTOj1%=WXI(U=Dv!6 z{#<#-)2+gCyyv=Jw?Ab#PVkxPDeH|sAxyG`|Ys}A$PW4TdBv%zDz z^?lwrxWR<%Vzc8Sgt|?FL6ej_*e&rhqJZ3Y>k=X(^dytycR;XDU16}Pc9Vn0>_@H+ zQ;a`GSMEG64=JRAOg%~L)x*w{2re6DVprNp+FcNra4VdNjiaF0M^*>CdPkt(m150rCue?FVdL0nFL$V%5y6N z%eLr5%YN7D06k5ji5*p4v$UMM)G??Q%RB27IvH7vYr_^3>1D-M66#MN8tWGw>WED} z5AhlsanO=STFYFs)Il_0i)l)f<8qn|$DW7ZXhf5xI;m+7M5-%P63XFQrG9>DMqHc} zsgNU9nR`b}E^mL5=@7<1_R~j@q_2U^3h|+`7YH-?C=vme1C3m`Fe0HC>pjt6f_XMh zy~-i-8R46QNYneL4t@)<0VU7({aUO?aH`z4V2+kxgH5pYD5)wCh75JqQY)jIPN=U6 z+qi8cGiOtXG2tXm;_CfpH9ESCz#i5B(42}rBJJF$jh<1sbpj^8&L;gzGHb8M{of+} zzF^8VgML2O9nxBW7AvdEt90vp+#kZxWf@A)o9f9}vKJy9NDBjBW zSt=Hcs=YWCwnfY1UYx*+msp{g!w0HC<_SM!VL1(I2PE?CS}r(eh?{I)mQixmo5^p# zV?2R!R@3GV6hwTCrfHiK#3Orj>I!GS2kYhk1S;aFBD_}u2v;0HYFq}Iz1Z(I4oca4 zxquja8$+8JW_EagDHf$a1OTk5S97umGSDaj)gH=fLs9>_=XvVj^Xj9a#gLdk=&3tl zfmK9MNnIX9v{?%xdw7568 zNrZ|roYs(vC4pHB5RJ8>)^*OuyNC>x7ad)tB_}3SgQ96+-JT^Qi<`xi=)_=$Skwv~ zdqeT9Pa`LYvCAn&rMa2aCDV(TMI#PA5g#RtV|CWpgDYRA^|55LLN^uNh*gOU>Z=a06qJ;$C9z8;n-Pq=qZnc1zUwJ@t)L;&NN+E5m zRkQ(SeM8=l-aoAKGKD>!@?mWTW&~)uF2PYUJ;tB^my`r9n|Ly~0c%diYzqs9W#FTjy?h&X3TnH zXqA{QI82sdjPO->f=^K^f>N`+B`q9&rN0bOXO79S&a9XX8zund(kW7O76f4dcWhIu zER`XSMSFbSL>b;Rp#`CuGJ&p$s~G|76){d?xSA5wVg##_O0DrmyEYppyBr%fyWbbv zp`K84JwRNP$d-pJ!Qk|(RMr?*!wi1if-9G#0p>>1QXKXWFy)eB3ai)l3601q8!9JC zvU#ZWWDNKq9g6fYs?JQ)Q4C_cgTy3FhgKb8s&m)DdmL5zhNK#8wWg!J*7G7Qhe9VU zha?^AQTDpYcuN!B+#1dE*X{<#!M%zfUQbj=zLE{dW0XeQ7-oIsGY6RbkP2re@Q{}r_$iiH0xU%iN*ST`A)-EH6eaZB$GA#v)cLi z*MpA(3bYk$oBDKAzu^kJoSUsDd|856DApz={3u8sbQV@JnRkp2nC|)m;#T=DvIL-O zI4vh;g7824l}*`_p@MT4+d`JZ2%6NQh=N9bmgJ#q!hK@_<`HQq3}Z8Ij>3%~<*= zcv=!oT#5xmeGI92lqm9sGVE%#X$ls;St|F#u!?5Y7syhx6q#MVRa&lBmmn%$C0QzU z);*ldgwwCmzM3uglr}!Z2G+?& zf%Dpo&mD%2ZcNFiN-Z0f;c_Q;A%f@>26f?{d1kxIJD}LxsQkB47SAdwinfMILZdN3 zfj^HmTzS3Ku5BxY>ANutS8WPQ-G>v4^_Qndy==P3pDm+Xc?>rUHl-4+^%Sp5atOja z2oP}ftw-rqnb}+khR3CrRg^ibi6?QYk1*i^;kQGirQ=uB9Sd1NTfT-Rbv;hqnY4neE5H1YUrjS2m+2&@uXiAo- zrKUX|Ohg7(6F(AoP~tj;NZlV#xsfo-5reuQHB$&EIAhyZk;bL;k9ouDmJNBAun;H& zn;Of1z_Qj`x&M;5X;{s~iGzBQTY^kv-k{ksbE*Dl%Qf%N@hQCfY~iUw!=F-*$cpf2 z3wix|aLBV0b;W@z^%7S{>9Z^T^fLOI68_;l@+Qzaxo`nAI8emTV@rRhEKZ z?*z_{oGdI~R*#<2{bkz$G~^Qef}$*4OYTgtL$e9q!FY7EqxJ2`zk6SQc}M(k(_MaV zSLJnTXw&@djco1~a(vhBl^&w=$fa9{Sru>7g8SHahv$&Bl(D@(Zwxo_3r=;VH|uc5 zi1Ny)J!<(KN-EcQ(xlw%PNwK8U>4$9nVOhj(y0l9X^vP1TA>r_7WtSExIOsz`nDOP zs}d>Vxb2Vo2e5x8p(n~Y5ggAyvib>d)6?)|E@{FIz?G3PVGLf7-;BxaP;c?7ddH$z zA+{~k^V=bZuXafOv!RPsE1GrR3J2TH9uB=Z67gok+u`V#}BR86hB1xl}H4v`F+mRfr zYhortD%@IGfh!JB(NUNSDh+qDz?4ztEgCz&bIG-Wg7w-ua4ChgQR_c+z8dT3<1?uX z*G(DKy_LTl*Ea!%v!RhpCXW1WJO6F`bgS-SB;Xw9#! z<*K}=#wVu9$`Yo|e!z-CPYH!nj7s9dEPr-E`DXUBu0n!xX~&|%#G=BeM?X@shQQMf zMvr2!y7p_gD5-!Lnm|a@z8Of^EKboZsTMk%5VsJEm>VsJ4W7Kv{<|#4f-qDE$D-W>gWT%z-!qXnDHhOvLk=?^a1*|0j z{pW{M0{#1VcR5;F!!fIlLVNh_Gj zbnW(_j?0c2q$EHIi@fSMR{OUKBcLr{Y&$hrM8XhPByyZaXy|dd&{hYQRJ9@Fn%h3p7*VQolBIV@Eq`=y%5BU~3RPa^$a?ixp^cCg z+}Q*X+CW9~TL29@OOng(#OAOd!)e$d%sr}^KBJ-?-X&|4HTmtemxmp?cT3uA?md4% zT8yZ0U;6Rg6JHy3fJae{6TMGS?ZUX6+gGTT{Q{)SI85$5FD{g-eR%O0KMpWPY`4@O zx!hen1*8^E(*}{m^V_?}(b5k3hYo=T+$&M32+B`}81~KKZhY;2H{7O-M@vbCzuX0n zW-&HXeyr1%I3$@ns-V1~Lb@wIpkmx|8I~ob1Of7i6BTNysEwI}=!nU%q7(V_^+d*G z7G;07m(CRTJup!`cdYi93r^+LY+`M*>aMuHJm(A8_O8C#A*$!Xvddgpjx5)?_EB*q zgE8o5O>e~9IiSC@WtZpF{4Bj2J5eZ>uUzY%TgWF7wdDE!fSQIAWCP)V{;HsU3ap?4 znRsiiDbtN7i9hapO;(|Ew>Ip2TZSvK9Z^N21%J?OiA_&eP1{(Pu_=%JjKy|HOardq ze?zK^K zA%sjF64*Wufad%H<) z^|t>e*h+Z1#l=5wHexzt9HNDNXgM=-OPWKd^5p!~%SIl>Fo&7BvNpbf8{NXmH)o{r zO=aBJ;meX1^{O%q;kqdw*5k!Y7%t_30 zy{nGRVc&5qt?dBwLs+^Sfp;f`YVMSB#C>z^a9@fpZ!xb|b-JEz1LBX7ci)V@W+kvQ89KWA0T~Lj$aCcfW#nD5bt&Y_< z-q{4ZXDqVg?|0o)j1%l0^_it0WF*LCn-+)c!2y5yS7aZIN$>0LqNnkujV*YVes(v$ zY@_-!Q;!ZyJ}Bg|G-~w@or&u0RO?vlt5*9~yeoPV_UWrO2J54b4#{D(D>jF(R88u2 zo#B^@iF_%S>{iXSol8jpmsZuJ?+;epg>k=$d`?GSegAVp3n$`GVDvK${N*#L_1`44 z{w0fL{2%)0|E+qgZtjX}itZz^KJt4Y;*8uSK}Ft38+3>j|K(PxIXXR-t4VopXo#9# zt|F{LWr-?34y`$nLBVV_*UEgA6AUI65dYIbqpNq9cl&uLJ0~L}<=ESlOm?Y-S@L*d z<7vt}`)TW#f%Rp$Q}6@3=j$7Tze@_uZO@aMn<|si{?S}~maII`VTjs&?}jQ4_cut9$)PEqMukwoXobzaKx^MV z2fQwl+;LSZ$qy%Tys0oo^K=jOw$!YwCv^ei4NBVauL)tN%=wz9M{uf{IB(BxK|lT*pFkmNK_1tV`nb%jH=a0~VNq2RCKY(rG7jz!-D^k)Ec)yS%17pE#o6&eY+ z^qN(hQT$}5F(=4lgNQhlxj?nB4N6ntUY6(?+R#B?W3hY_a*)hnr4PA|vJ<6p`K3Z5Hy z{{8(|ux~NLUW=!?9Qe&WXMTAkQnLXg(g=I@(VG3{HE13OaUT|DljyWXPs2FE@?`iU z4GQlM&Q=T<4&v@Fe<+TuXiZQT3G~vZ&^POfmI1K2h6t4eD}Gk5XFGpbj1n_g*{qmD6Xy z`6Vv|lLZtLmrnv*{Q%xxtcWVj3K4M%$bdBk_a&ar{{GWyu#ljM;dII;*jP;QH z#+^o-A4np{@|Mz+LphTD0`FTyxYq#wY)*&Ls5o{0z9yg2K+K7ZN>j1>N&;r+Z`vI| zDzG1LJZ+sE?m?>x{5LJx^)g&pGEpY=fQ-4}{x=ru;}FL$inHemOg%|R*ZXPodU}Kh zFEd5#+8rGq$Y<_?k-}r5zgQ3jRV=ooHiF|@z_#D4pKVEmn5CGV(9VKCyG|sT9nc=U zEoT67R`C->KY8Wp-fEcjjFm^;Cg(ls|*ABVHq8clBE(;~K^b+S>6uj70g? z&{XQ5U&!Z$SO7zfP+y^8XBbiu*Cv-yJG|l-oe*!s5$@Lh_KpxYL2sx`B|V=dETN>5K+C+CU~a_3cI8{vbu$TNVdGf15*>D zz@f{zIlorkY>TRh7mKuAlN9A0>N>SV`X)+bEHms=mfYTMWt_AJtz_h+JMmrgH?mZt zm=lfdF`t^J*XLg7v+iS)XZROygK=CS@CvUaJo&w2W!Wb@aa?~Drtf`JV^cCMjngVZ zv&xaIBEo8EYWuML+vxCpjjY^s1-ahXJzAV6hTw%ZIy!FjI}aJ+{rE&u#>rs)vzuxz z+$5z=7W?zH2>Eb32dvgHYZtCAf!=OLY-pb4>Ae79rd68E2LkVPj-|jFeyqtBCCwiW zkB@kO_(3wFq)7qwV}bA=zD!*@UhT`geq}ITo%@O(Z5Y80nEX~;0-8kO{oB6|(4fQh z);73T!>3@{ZobPwRv*W?7m0Ml9GmJBCJd&6E?hdj9lV= z4flNfsc(J*DyPv?RCOx!MSvk(M952PJ-G|JeVxWVjN~SNS6n-_Ge3Q;TGE;EQvZg86%wZ`MB zSMQua(i*R8a75!6$QRO^(o7sGoomb+Y{OMy;m~Oa`;P9Yqo>?bJAhqXxLr7_3g_n>f#UVtxG!^F#1+y@os6x(sg z^28bsQ@8rw%Gxk-stAEPRbv^}5sLe=VMbkc@Jjimqjvmd!3E7+QnL>|(^3!R} zD-l1l7*Amu@j+PWLGHXXaFG0Ct2Q=}5YNUxEQHCAU7gA$sSC<5OGylNnQUa>>l%sM zyu}z6i&({U@x^hln**o6r2s-(C-L50tQvz|zHTqW!ir?w&V23tuYEDJVV#5pE|OJu z7^R!A$iM$YCe?8n67l*J-okwfZ+ZTkGvZ)tVPfR;|3gyFjF)8V zyXXN=!*bpyRg9#~Bg1+UDYCt0 ztp4&?t1X0q>uz;ann$OrZs{5*r`(oNvw=$7O#rD|Wuv*wIi)4b zGtq4%BX+kkagv3F9Id6~-c+1&?zny%w5j&nk9SQfo0k4LhdSU_kWGW7axkfpgR`8* z!?UTG*Zi_baA1^0eda8S|@&F z{)Rad0kiLjB|=}XFJhD(S3ssKlveFFmkN{Vl^_nb!o5M!RC=m)V&v2%e?ZoRC@h3> zJ(?pvToFd`*Zc@HFPL#=otWKwtuuQ_dT-Hr{S%pQX<6dqVJ8;f(o)4~VM_kEQkMR+ zs1SCVi~k>M`u1u2xc}>#D!V&6nOOh-E$O&SzYrjJdZpaDv1!R-QGA141WjQe2s0J~ zQ;AXG)F+K#K8_5HVqRoRM%^EduqOnS(j2)|ctA6Q^=|s_WJYU;Z%5bHp08HPL`YF2 zR)Ad1z{zh`=sDs^&V}J z%$Z$!jd7BY5AkT?j`eqMs%!Gm@T8)4w3GYEX~IwgE~`d|@T{WYHkudy(47brgHXx& zBL1yFG6!!!VOSmDxBpefy2{L_u5yTwja&HA!mYA#wg#bc-m%~8aRR|~AvMnind@zs zy>wkShe5&*un^zvSOdlVu%kHsEo>@puMQ`b1}(|)l~E{5)f7gC=E$fP(FC2=F<^|A zxeIm?{EE!3sO!Gr7e{w)Dx(uU#3WrFZ>ibmKSQ1tY?*-Nh1TDHLe+k*;{Rp!Bmd_m zb#^kh`Y*8l|9Cz2e{;RL%_lg{#^Ar+NH|3z*Zye>!alpt{z;4dFAw^^H!6ING*EFc z_yqhr8d!;%nHX9AKhFQZBGrSzfzYCi%C!(Q5*~hX>)0N`vbhZ@N|i;_972WSx*>LH z87?en(;2_`{_JHF`Sv6Wlps;dCcj+8IJ8ca6`DsOQCMb3n# z3)_w%FuJ3>fjeOOtWyq)ag|PmgQbC-s}KRHG~enBcIwqIiGW8R8jFeBNY9|YswRY5 zjGUxdGgUD26wOpwM#8a!Nuqg68*dG@VM~SbOroL_On0N6QdT9?)NeB3@0FCC?Z|E0 z6TPZj(AsPtwCw>*{eDEE}Gby>0q{*lI+g2e&(YQrsY&uGM{O~}(oM@YWmb*F zA0^rr5~UD^qmNljq$F#ARXRZ1igP`MQx4aS6*MS;Ot(1L5jF2NJ;de!NujUYg$dr# z=TEL_zTj2@>ZZN(NYCeVX2==~=aT)R30gETO{G&GM4XN<+!&W&(WcDP%oL8PyIVUC zs5AvMgh6qr-2?^unB@mXK*Dbil^y-GTC+>&N5HkzXtozVf93m~xOUHn8`HpX=$_v2 z61H;Z1qK9o;>->tb8y%#4H)765W4E>TQ1o0PFj)uTOPEvv&}%(_mG0ISmyhnQV33Z$#&yd{ zc{>8V8XK$3u8}04CmAQ#I@XvtmB*s4t8va?-IY4@CN>;)mLb_4!&P3XSw4pA_NzDb zORn!blT-aHk1%Jpi>T~oGLuh{DB)JIGZ9KOsciWs2N7mM1JWM+lna4vkDL?Q)z_Ct z`!mi0jtr+4*L&N7jk&LodVO#6?_qRGVaucqVB8*us6i3BTa^^EI0x%EREQSXV@f!lak6Wf1cNZ8>*artIJ(ADO*=<-an`3zB4d*oO*8D1K!f z*A@P1bZCNtU=p!742MrAj%&5v%Xp_dSX@4YCw%F|%Dk=u|1BOmo)HsVz)nD5USa zR~??e61sO(;PR)iaxK{M%QM_rIua9C^4ppVS$qCT9j2%?*em?`4Z;4@>I(c%M&#cH z>4}*;ej<4cKkbCAjjDsyKS8rIm90O)Jjgyxj5^venBx&7B!xLmzxW3jhj7sR(^3Fz z84EY|p1NauwXUr;FfZjdaAfh%ivyp+^!jBjJuAaKa!yCq=?T_)R!>16?{~p)FQ3LDoMyG%hL#pR!f@P%*;#90rs_y z@9}@r1BmM-SJ#DeuqCQk=J?ixDSwL*wh|G#us;dd{H}3*-Y7Tv5m=bQJMcH+_S`zVtf;!0kt*(zwJ zs+kedTm!A}cMiM!qv(c$o5K%}Yd0|nOd0iLjus&;s0Acvoi-PFrWm?+q9f^FslxGi z6ywB`QpL$rJzWDg(4)C4+!2cLE}UPCTBLa*_=c#*$b2PWrRN46$y~yST3a2$7hEH= zNjux+wna^AzQ=KEa_5#9Ph=G1{S0#hh1L3hQ`@HrVnCx{!fw_a0N5xV(iPdKZ-HOM za)LdgK}1ww*C_>V7hbQnTzjURJL`S%`6nTHcgS+dB6b_;PY1FsrdE8(2K6FN>37!62j_cBlui{jO^$dPkGHV>pXvW0EiOA zqW`YaSUBWg_v^Y5tPJfWLcLpsA8T zG)!x>pKMpt!lv3&KV!-um= zKCir6`bEL_LCFx4Z5bAFXW$g3Cq`?Q%)3q0r852XI*Der*JNuKUZ`C{cCuu8R8nkt z%pnF>R$uY8L+D!V{s^9>IC+bmt<05h**>49R*#vpM*4i0qRB2uPbg8{{s#9yC;Z18 zD7|4m<9qneQ84uX|J&f-g8a|nFKFt34@Bt{CU`v(SYbbn95Q67*)_Esl_;v291s=9 z+#2F2apZU4Tq=x+?V}CjwD(P=U~d<=mfEFuyPB`Ey82V9G#Sk8H_Ob_RnP3s?)S_3 zr%}Pb?;lt_)Nf>@zX~D~TBr;-LS<1I##8z`;0ZCvI_QbXNh8Iv)$LS=*gHr;}dgb=w5$3k2la1keIm|=7<-JD>)U%=Avl0Vj@+&vxn zt-)`vJxJr88D&!}2^{GPXc^nmRf#}nb$4MMkBA21GzB`-Or`-3lq^O^svO7Vs~FdM zv`NvzyG+0T!P8l_&8gH|pzE{N(gv_tgDU7SWeiI-iHC#0Ai%Ixn4&nt{5y3(GQs)i z&uA;~_0shP$0Wh0VooIeyC|lak__#KVJfxa7*mYmZ22@(<^W}FdKjd*U1CqSjNKW% z*z$5$=t^+;Ui=MoDW~A7;)Mj%ibX1_p4gu>RC}Z_pl`U*{_z@+HN?AF{_W z?M_X@o%w8fgFIJ$fIzBeK=v#*`mtY$HC3tqw7q^GCT!P$I%=2N4FY7j9nG8aIm$c9 zeKTxVKN!UJ{#W)zxW|Q^K!3s;(*7Gbn;e@pQBCDS(I|Y0euK#dSQ_W^)sv5pa%<^o zyu}3d?Lx`)3-n5Sy9r#`I{+t6x%I%G(iewGbvor&I^{lhu-!#}*Q3^itvY(^UWXgvthH52zLy&T+B)Pw;5>4D6>74 zO_EBS)>l!zLTVkX@NDqyN2cXTwsUVao7$HcqV2%t$YzdAC&T)dwzExa3*kt9d(}al zA~M}=%2NVNUjZiO7c>04YH)sRelXJYpWSn^aC$|Ji|E13a^-v2MB!Nc*b+=KY7MCm zqIteKfNkONq}uM;PB?vvgQvfKLPMB8u5+Am=d#>g+o&Ysb>dX9EC8q?D$pJH!MTAqa=DS5$cb+;hEvjwVfF{4;M{5U&^_+r zvZdu_rildI!*|*A$TzJ&apQWV@p{!W`=?t(o0{?9y&vM)V)ycGSlI3`;ps(vf2PUq zX745#`cmT*ra7XECC0gKkpu2eyhFEUb?;4@X7weEnLjXj_F~?OzL1U1L0|s6M+kIhmi%`n5vvDALMagi4`wMc=JV{XiO+^ z?s9i7;GgrRW{Mx)d7rj)?(;|b-`iBNPqdwtt%32se@?w4<^KU&585_kZ=`Wy^oLu9 z?DQAh5z%q;UkP48jgMFHTf#mj?#z|=w= z(q6~17Vn}P)J3M?O)x))%a5+>TFW3No~TgP;f}K$#icBh;rSS+R|}l鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties index ebf7ae9184..3fa8f862f7 100644 --- a/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/gradle-modules/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Thu Oct 12 16:43:02 BDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip From a4c6e7fd546d6ecdc3b859561c91f9d840cee81e Mon Sep 17 00:00:00 2001 From: timis1 Date: Sun, 19 Nov 2023 20:43:50 +0200 Subject: [PATCH 581/831] JAVA-26721 Upgrade okhttp to latest version --- apache-libraries/pom.xml | 2 +- java-spi/exchange-rate-impl/pom.xml | 2 +- libraries-http-2/pom.xml | 2 +- libraries-http/pom.xml | 2 +- osgi/pom.xml | 2 +- spring-reactive-modules/spring-reactive-client/pom.xml | 2 +- spring-web-modules/spring-rest-simple/pom.xml | 2 +- spring-web-modules/spring-resttemplate/pom.xml | 2 +- web-modules/jooby/pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apache-libraries/pom.xml b/apache-libraries/pom.xml index c1def03bee..02e9f08a8d 100644 --- a/apache-libraries/pom.xml +++ b/apache-libraries/pom.xml @@ -191,7 +191,7 @@ 2.0.6 2.0.1.Final 1.2.15 - 3.10.0 + 4.12.0 1.2.15 1.2.15 1.2.15 diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml index 254a8bb809..7ec10b1c04 100644 --- a/java-spi/exchange-rate-impl/pom.xml +++ b/java-spi/exchange-rate-impl/pom.xml @@ -65,7 +65,7 @@ 1.0.0-SNAPSHOT - 3.10.0 + 4.12.0 1.0 1.0.1 1.1.2 diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index c80c5729a7..b49e4b9387 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -109,7 +109,7 @@ - 4.9.1 + 4.12.0 2.10.1 4.9.1 1.0.3 diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml index c726b56b5d..caf42639cc 100644 --- a/libraries-http/pom.xml +++ b/libraries-http/pom.xml @@ -105,7 +105,7 @@ 2.10.1 4.5.3 - 4.9.1 + 4.12.0 1.23.0 2.2.0 2.3.0 diff --git a/osgi/pom.xml b/osgi/pom.xml index ecc8758ef9..16b1f5d106 100644 --- a/osgi/pom.xml +++ b/osgi/pom.xml @@ -91,7 +91,7 @@ - 3.9.0 + 4.12.0 1.1 6.0.0 3.3.0 diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml index 94134e5271..5736ce497f 100644 --- a/spring-reactive-modules/spring-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-reactive-client/pom.xml @@ -179,7 +179,7 @@ 1.0.1.RELEASE 1.0 1.1.6 - 4.0.1 + 4.12.0 3.5.3 2.26.0 3.1.4 diff --git a/spring-web-modules/spring-rest-simple/pom.xml b/spring-web-modules/spring-rest-simple/pom.xml index 2764ac8393..089c5e411f 100644 --- a/spring-web-modules/spring-rest-simple/pom.xml +++ b/spring-web-modules/spring-rest-simple/pom.xml @@ -292,7 +292,7 @@ 1.6.0 3.0.4 - 3.4.1 + 4.12.0 2.2.0 diff --git a/spring-web-modules/spring-resttemplate/pom.xml b/spring-web-modules/spring-resttemplate/pom.xml index 4abaac5628..5cf1476f87 100644 --- a/spring-web-modules/spring-resttemplate/pom.xml +++ b/spring-web-modules/spring-resttemplate/pom.xml @@ -274,7 +274,7 @@ 1.6.1 3.0.4 - 3.4.1 + 4.12.0 3.6.3 1.8 1.8 diff --git a/web-modules/jooby/pom.xml b/web-modules/jooby/pom.xml index 238f17571f..998ceaef4e 100644 --- a/web-modules/jooby/pom.xml +++ b/web-modules/jooby/pom.xml @@ -77,7 +77,7 @@ com.baeldung.jooby.App 3.2.4 3.8.1 - 4.9.1 + 4.12.0 \ No newline at end of file From 3371e4fe5311c59f9797f0fd23c30b0d2872ce85 Mon Sep 17 00:00:00 2001 From: Eugene Kovko <37694937+eukovko@users.noreply.github.com> Date: Sun, 19 Nov 2023 20:27:45 +0100 Subject: [PATCH 582/831] BAEL-6718: Setting a Spring Bean to Null (#15242) * BAEL-6718: Setting a Spring Bean to Null * BAEL-6718: Java Nullable Example --- .../baeldung/nullablebean/MainComponent.java | 21 ++++ .../baeldung/nullablebean/SubComponent.java | 8 ++ .../nonrequired/NonRequiredConfiguration.java | 8 ++ .../nonrequired/NonRequiredMainComponent.java | 19 ++++ .../nonrequired/NonRequiredSubComponent.java | 5 + .../NullableJavaConfiguration.java | 9 ++ .../nullablejava/NullableMainComponent.java | 22 +++++ .../nullablejava/NullableSubComponent.java | 5 + .../nullablespring/NullableConfiguration.java | 20 ++++ .../NullableSupplierConfiguration.java | 21 ++++ .../optionable/OptionableConfiguration.java | 17 ++++ .../NullableXMLComponentUnitTest.java | 95 +++++++++++++++++++ .../non-nullable-application-context.xml | 10 ++ ...-configurable-spel-application-context.xml | 14 +++ .../test/resources/non-nullable.properties | 1 + .../nullable-application-context.xml | 11 +++ ...-configurable-spel-application-context.xml | 14 +++ .../nullable-spel-application-context.xml | 9 ++ .../src/test/resources/nullable.properties | 1 + 19 files changed, 310 insertions(+) create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/MainComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/SubComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredConfiguration.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredMainComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredSubComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableJavaConfiguration.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableMainComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableSubComponent.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableConfiguration.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableSupplierConfiguration.java create mode 100644 spring-di-4/src/main/java/com/baeldung/nullablebean/optionable/OptionableConfiguration.java create mode 100644 spring-di-4/src/test/java/com/baeldung/nullablebean/NullableXMLComponentUnitTest.java create mode 100644 spring-di-4/src/test/resources/non-nullable-application-context.xml create mode 100644 spring-di-4/src/test/resources/non-nullable-configurable-spel-application-context.xml create mode 100644 spring-di-4/src/test/resources/non-nullable.properties create mode 100644 spring-di-4/src/test/resources/nullable-application-context.xml create mode 100644 spring-di-4/src/test/resources/nullable-configurable-spel-application-context.xml create mode 100644 spring-di-4/src/test/resources/nullable-spel-application-context.xml create mode 100644 spring-di-4/src/test/resources/nullable.properties diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/MainComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/MainComponent.java new file mode 100644 index 0000000000..9f97b108da --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/MainComponent.java @@ -0,0 +1,21 @@ +package com.baeldung.nullablebean; + +import org.springframework.stereotype.Component; + +@Component +public class MainComponent { + + private SubComponent subComponent; + + public MainComponent(final SubComponent subComponent) { + this.subComponent = subComponent; + } + + public SubComponent getSubComponent() { + return subComponent; + } + + public void setSubComponent(final SubComponent subComponent) { + this.subComponent = subComponent; + } +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/SubComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/SubComponent.java new file mode 100644 index 0000000000..b171d28db4 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/SubComponent.java @@ -0,0 +1,8 @@ +package com.baeldung.nullablebean; + +import org.springframework.stereotype.Component; + +@Component +public class SubComponent { + +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredConfiguration.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredConfiguration.java new file mode 100644 index 0000000000..d34479a565 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredConfiguration.java @@ -0,0 +1,8 @@ +package com.baeldung.nullablebean.nonrequired; + +import org.springframework.context.annotation.ComponentScan; + +@ComponentScan +public class NonRequiredConfiguration { + +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredMainComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredMainComponent.java new file mode 100644 index 0000000000..f181d2068d --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredMainComponent.java @@ -0,0 +1,19 @@ +package com.baeldung.nullablebean.nonrequired; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NonRequiredMainComponent { + + @Autowired(required = false) + private NonRequiredSubComponent subComponent; + + public NonRequiredSubComponent getSubComponent() { + return subComponent; + } + + public void setSubComponent(final NonRequiredSubComponent subComponent) { + this.subComponent = subComponent; + } +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredSubComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredSubComponent.java new file mode 100644 index 0000000000..6678880a24 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nonrequired/NonRequiredSubComponent.java @@ -0,0 +1,5 @@ +package com.baeldung.nullablebean.nonrequired; + +public class NonRequiredSubComponent { + +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableJavaConfiguration.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableJavaConfiguration.java new file mode 100644 index 0000000000..c13dbe3363 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableJavaConfiguration.java @@ -0,0 +1,9 @@ +package com.baeldung.nullablebean.nullablejava; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan +public class NullableJavaConfiguration { +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableMainComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableMainComponent.java new file mode 100644 index 0000000000..f35ead7477 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableMainComponent.java @@ -0,0 +1,22 @@ +package com.baeldung.nullablebean.nullablejava; + +import jakarta.annotation.Nullable; +import org.springframework.stereotype.Component; + +@Component +public class NullableMainComponent { + + private NullableSubComponent subComponent; + + public NullableMainComponent(final @Nullable NullableSubComponent subComponent) { + this.subComponent = subComponent; + } + + public NullableSubComponent getSubComponent() { + return subComponent; + } + + public void setSubComponent(final NullableSubComponent subComponent) { + this.subComponent = subComponent; + } +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableSubComponent.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableSubComponent.java new file mode 100644 index 0000000000..c3cbd78c43 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablejava/NullableSubComponent.java @@ -0,0 +1,5 @@ +package com.baeldung.nullablebean.nullablejava; + +public class NullableSubComponent { + +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableConfiguration.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableConfiguration.java new file mode 100644 index 0000000000..17942d31cd --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableConfiguration.java @@ -0,0 +1,20 @@ +package com.baeldung.nullablebean.nullablespring; + +import com.baeldung.nullablebean.MainComponent; +import com.baeldung.nullablebean.SubComponent; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NullableConfiguration { + + @Bean + public MainComponent mainComponent(SubComponent subComponent) { + return new MainComponent(subComponent); + } + + @Bean + public SubComponent subComponent() { + return null; + } +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableSupplierConfiguration.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableSupplierConfiguration.java new file mode 100644 index 0000000000..debaa60fa9 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/nullablespring/NullableSupplierConfiguration.java @@ -0,0 +1,21 @@ +package com.baeldung.nullablebean.nullablespring; + +import com.baeldung.nullablebean.MainComponent; +import com.baeldung.nullablebean.SubComponent; +import java.util.function.Supplier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NullableSupplierConfiguration { + + @Bean + public MainComponent mainComponent(Supplier subComponentSupplier) { + return new MainComponent(subComponentSupplier.get()); + } + + @Bean + public Supplier subComponentSupplier() { + return () -> null; + } +} diff --git a/spring-di-4/src/main/java/com/baeldung/nullablebean/optionable/OptionableConfiguration.java b/spring-di-4/src/main/java/com/baeldung/nullablebean/optionable/OptionableConfiguration.java new file mode 100644 index 0000000000..fd54553e8c --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/nullablebean/optionable/OptionableConfiguration.java @@ -0,0 +1,17 @@ +package com.baeldung.nullablebean.optionable; + +import com.baeldung.nullablebean.MainComponent; +import com.baeldung.nullablebean.SubComponent; +import java.util.Optional; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OptionableConfiguration { + + @Bean + public MainComponent mainComponent(Optional optionalSubComponent) { + return new MainComponent(optionalSubComponent.orElse(null)); + } + +} diff --git a/spring-di-4/src/test/java/com/baeldung/nullablebean/NullableXMLComponentUnitTest.java b/spring-di-4/src/test/java/com/baeldung/nullablebean/NullableXMLComponentUnitTest.java new file mode 100644 index 0000000000..2997da478c --- /dev/null +++ b/spring-di-4/src/test/java/com/baeldung/nullablebean/NullableXMLComponentUnitTest.java @@ -0,0 +1,95 @@ +package com.baeldung.nullablebean; + +import static org.junit.jupiter.api.Assertions.*; + +import com.baeldung.nullablebean.nonrequired.NonRequiredConfiguration; +import com.baeldung.nullablebean.nonrequired.NonRequiredMainComponent; +import com.baeldung.nullablebean.nullablejava.NullableJavaConfiguration; +import com.baeldung.nullablebean.nullablejava.NullableMainComponent; +import com.baeldung.nullablebean.nullablespring.NullableConfiguration; +import com.baeldung.nullablebean.nullablespring.NullableSupplierConfiguration; +import com.baeldung.nullablebean.optionable.OptionableConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.UnsatisfiedDependencyException; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +class NullableXMLComponentUnitTest { + + @Test + void givenContextWhenCreatingNullableMainComponentThenSubComponentIsNull() { + final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + NullableJavaConfiguration.class); + final NullableMainComponent bean = context.getBean(NullableMainComponent.class); + assertNull(bean.getSubComponent()); + } + @Test + void givenNonRequiredContextWhenCreatingMainComponentThenSubComponentIsNull() { + final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + NonRequiredConfiguration.class); + final NonRequiredMainComponent bean = context.getBean(NonRequiredMainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenOptionableContextWhenCreatingMainComponentThenSubComponentIsNull() { + final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + OptionableConfiguration.class); + final MainComponent bean = context.getBean(MainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenNullableSupplierContextWhenCreatingMainComponentThenSubComponentIsNull() { + final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + NullableSupplierConfiguration.class); + final MainComponent bean = context.getBean(MainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenNullableContextWhenCreatingMainComponentThenSubComponentIsNull() { + assertThrows(UnsatisfiedDependencyException.class, () -> new AnnotationConfigApplicationContext( + NullableConfiguration.class)); + } + + @Test + void givenNullableXMLContextWhenCreatingMainComponentThenSubComponentIsNull() { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "nullable-application-context.xml"); + final MainComponent bean = context.getBean(MainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenNullableSpELXMLContextWhenCreatingMainComponentThenSubComponentIsNull() { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "nullable-spel-application-context.xml"); + final MainComponent bean = context.getBean(MainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenNullableSpELXMLContextWithNullablePropertiesWhenCreatingMainComponentThenSubComponentIsNull() { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "nullable-configurable-spel-application-context.xml"); + final MainComponent bean = context.getBean(MainComponent.class); + assertNull(bean.getSubComponent()); + } + + @Test + void givenNullableSpELXMLContextWithNonNullablePropertiesWhenCreatingMainComponentThenSubComponentIsNull() { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "non-nullable-configurable-spel-application-context.xml"); + final MainComponent bean = context.getBean(MainComponent.class); + assertNotNull(bean.getSubComponent()); + } + + @Test + void givenXMLContextWhenCreatingMainComponentThenSubComponentNotNull() { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "non-nullable-application-context.xml"); + final MainComponent bean = context.getBean(MainComponent.class); + assertNotNull(bean.getSubComponent()); + } +} \ No newline at end of file diff --git a/spring-di-4/src/test/resources/non-nullable-application-context.xml b/spring-di-4/src/test/resources/non-nullable-application-context.xml new file mode 100644 index 0000000000..07a8115bac --- /dev/null +++ b/spring-di-4/src/test/resources/non-nullable-application-context.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/spring-di-4/src/test/resources/non-nullable-configurable-spel-application-context.xml b/spring-di-4/src/test/resources/non-nullable-configurable-spel-application-context.xml new file mode 100644 index 0000000000..8a7b107ee4 --- /dev/null +++ b/spring-di-4/src/test/resources/non-nullable-configurable-spel-application-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di-4/src/test/resources/non-nullable.properties b/spring-di-4/src/test/resources/non-nullable.properties new file mode 100644 index 0000000000..76b127a2e5 --- /dev/null +++ b/spring-di-4/src/test/resources/non-nullable.properties @@ -0,0 +1 @@ +nullableBean = subComponent \ No newline at end of file diff --git a/spring-di-4/src/test/resources/nullable-application-context.xml b/spring-di-4/src/test/resources/nullable-application-context.xml new file mode 100644 index 0000000000..9794dbbfff --- /dev/null +++ b/spring-di-4/src/test/resources/nullable-application-context.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-di-4/src/test/resources/nullable-configurable-spel-application-context.xml b/spring-di-4/src/test/resources/nullable-configurable-spel-application-context.xml new file mode 100644 index 0000000000..f6f04a6289 --- /dev/null +++ b/spring-di-4/src/test/resources/nullable-configurable-spel-application-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di-4/src/test/resources/nullable-spel-application-context.xml b/spring-di-4/src/test/resources/nullable-spel-application-context.xml new file mode 100644 index 0000000000..c0a14b4cbb --- /dev/null +++ b/spring-di-4/src/test/resources/nullable-spel-application-context.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-di-4/src/test/resources/nullable.properties b/spring-di-4/src/test/resources/nullable.properties new file mode 100644 index 0000000000..315f9b0d03 --- /dev/null +++ b/spring-di-4/src/test/resources/nullable.properties @@ -0,0 +1 @@ +nullableBean = null \ No newline at end of file From 684a14ce5f29d574486e8846c12d88d7575b88af Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Mon, 20 Nov 2023 01:06:51 +0530 Subject: [PATCH 583/831] [BAEL-6787] increment value of a map (#15243) Co-authored-by: Bhaskar --- .../core-java-collections-maps-7/pom.xml | 5 + .../com/baeldung/map/BenchmarkMapMethods.java | 70 ++++++++++++ .../baeldung/map/IncrementMapValueWays.java | 80 ++++++++++++++ .../map/IncrementMapValueUnitTest.java | 103 ++++++++++++++++++ 4 files changed, 258 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java create mode 100644 core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java create mode 100644 core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index a7acded9cf..a05b1b3528 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -33,6 +33,11 @@ commons-csv ${csv.version} + + com.google.guava + guava + 32.1.2-jre + diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java new file mode 100644 index 0000000000..eca028efe4 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java @@ -0,0 +1,70 @@ +package com.baeldung.map; + +import java.util.HashMap; +import java.util.Map; + +public class BenchmarkMapMethods { + public static void main(String[] args) { + BenchmarkMapMethods bmm = new BenchmarkMapMethods(); + Map map = new HashMap<>(); + map.put("Guava", bmm.benchMarkGuavaMap()); + map.put("ContainsKey", bmm.benchContainsKeyMap()); + map.put("MergeMethod", bmm.benchMarkMergeMethod()); + map.put("ComputeMethod", bmm.benchMarComputeMethod()); + map.put("GetOrDefault", bmm.benchMarkGetOrDefaultMethod()); + } + + private long benchMarkGuavaMap() { + long startTime = System.nanoTime(); + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingAtomicMap(getString()); + long endTime = System.nanoTime(); + return endTime - startTime; + } + + private long benchContainsKeyMap() { + long startTime = System.nanoTime(); + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingContainsKey(getString()); + long endTime = System.nanoTime(); + return endTime - startTime; + } + + private long benchMarComputeMethod() { + long startTime = System.nanoTime(); + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingCompute(getString()); + long endTime = System.nanoTime(); + return endTime - startTime; + } + + private long benchMarkMergeMethod() { + long startTime = System.nanoTime(); + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingMerge(getString()); + long endTime = System.nanoTime(); + return endTime - startTime; + } + + private long benchMarkGetOrDefaultMethod() { + long startTime = System.nanoTime(); + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingGetOrDefault(getString()); + long endTime = System.nanoTime(); + return endTime - startTime; + } + + private String getString() { + return + "Once upon a time in a quaint village nestled between rolling hills and whispering forests, there lived a solitary storyteller named Elias. Elias was known for spinning tales that transported listeners to magical realms and awakened forgotten dreams.\n" + + "\n" + + "His favorite spot was beneath an ancient oak tree, its sprawling branches offering shade to those who sought refuge from the bustle of daily life. Villagers of all ages would gather around Elias, their faces illuminated by the warmth of his stories.\n" + + "\n" + "One evening, as dusk painted the sky in hues of orange and purple, a curious young girl named Lily approached Elias. Her eyes sparkled with wonder as she asked for a tale unlike any other.\n" + "\n" + + "Elias smiled, sensing her thirst for adventure, and began a story about a forgotten kingdom veiled by mist, guarded by mystical creatures and enchanted by ancient spells. With each word, the air grew thick with anticipation, and the listeners were transported into a world where magic danced on the edges of reality.\n" + + "\n" + "As Elias weaved the story, Lily's imagination took flight. She envisioned herself as a brave warrior, wielding a shimmering sword against dark forces, her heart fueled by courage and kindness.\n" + "\n" + + "The night wore on, but the spell of the tale held everyone captive. The villagers laughed, gasped, and held their breaths, journeying alongside the characters through trials and triumphs.\n" + "\n" + + "As the final words lingered in the air, a sense of enchantment settled upon the listeners. They thanked Elias for the gift of his storytelling, each carrying a piece of the magical kingdom within their hearts.\n" + "\n" + + "Lily, inspired by the story, vowed to cherish the spirit of adventure and kindness in her own life. With a newfound spark in her eyes, she bid Elias goodnight, already dreaming of the countless adventures awaiting her.\n" + "\n" + + "Under the star-studded sky, Elias remained beneath the ancient oak, his heart aglow with the joy of sharing tales that ignited imagination and inspired dreams. And as the night embraced the village, whispers of the enchanted kingdom lingered in the breeze, promising endless possibilities to those who dared to believe."; + } +} diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java new file mode 100644 index 0000000000..70b3c6c54d --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java @@ -0,0 +1,80 @@ +package com.baeldung.map; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import com.google.common.util.concurrent.AtomicLongMap; + +public class IncrementMapValueWays { + + public Map charFrequencyUsingContainsKey(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + int count = 0; + if (charMap.containsKey(sentence.charAt(c))) { + count = charMap.get(sentence.charAt(c)); + } + charMap.put(sentence.charAt(c), count + 1); + } + return charMap; + } + + public Map charFrequencyUsingGetOrDefault(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + charMap.put(sentence.charAt(c), charMap.getOrDefault(sentence.charAt(c), 0) + 1); + } + return charMap; + } + + public Map charFrequencyUsingMerge(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + charMap.merge(sentence.charAt(c), 1, Integer::sum); + } + return charMap; + } + + public Map charFrequencyUsingCompute(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + charMap.compute(sentence.charAt(c), (key, value) -> (value == null) ? 1 : value + 1); + } + return charMap; + } + + public Map charFrequencyUsingAtomicMap(String sentence) { + AtomicLongMap map = AtomicLongMap.create(); + for (int c = 0; c < sentence.length(); c++) { + map.getAndIncrement(sentence.charAt(c)); + } + return map.asMap(); + } + + public Map charFrequencyWithConcurrentMap(String sentence, Map charMap) { + for (int c = 0; c < sentence.length(); c++) { + charMap.compute(sentence.charAt(c), (key, value) -> (value == null) ? 1 : value + 1); + } + return charMap; + } + + public Map charFrequencyWithGetAndIncrement(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + charMap.putIfAbsent(sentence.charAt(c), new AtomicInteger(0)); + charMap.get(sentence.charAt(c)) + .incrementAndGet(); + } + return charMap; + } + + public Map charFrequencyWithGetAndIncrementComputeIfAbsent(String sentence) { + Map charMap = new HashMap<>(); + for (int c = 0; c < sentence.length(); c++) { + charMap.computeIfAbsent(sentence.charAt(c), k -> new AtomicInteger(0)) + .incrementAndGet(); + } + return charMap; + } +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java new file mode 100644 index 0000000000..df4f2b787e --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java @@ -0,0 +1,103 @@ +package com.baeldung.map; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.Assert; +import org.junit.Test; + +public class IncrementMapValueUnitTest { + + @Test + public void givenString_whenUsingContainsKey_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyUsingContainsKey(string); + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap, actualMap); + } + + @Test + public void givenString_whenUsingGetOrDefault_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyUsingGetOrDefault(string); + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap, actualMap); + } + + @Test + public void givenString_whenUsingMapMerge_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyUsingMerge(string); + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap, actualMap); + } + + @Test + public void givenString_whenUsingMapCompute_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyUsingCompute(string); + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap, actualMap); + } + + @Test + public void givenString_whenUsingGuava_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyUsingAtomicMap(string); + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap.keySet(), actualMap.keySet()); + } + + @Test + public void givenString_whenUsingIncrementAndGet_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyWithGetAndIncrement(string); + Assert.assertEquals(getExpectedMap().keySet(), actualMap.keySet()); + } + + @Test + public void givenString_whenUsingIncrementAndGetAndComputeIfAbsent_thenReturnFreqMap() { + String string = "the quick brown fox jumps over the lazy dog"; + IncrementMapValueWays ic = new IncrementMapValueWays(); + Map actualMap = ic.charFrequencyWithGetAndIncrementComputeIfAbsent(string); + Assert.assertEquals(getExpectedMap().keySet(), actualMap.keySet()); + } + + @Test + public void givenString_whenUsingConcurrentMapCompute_thenReturnFreqMap() throws InterruptedException { + Map charMap = new ConcurrentHashMap<>(); + Thread thread1 = new Thread(() -> { + IncrementMapValueWays ic = new IncrementMapValueWays(); + ic.charFrequencyWithConcurrentMap("the quick brown", charMap); + }); + + Thread thread2 = new Thread(() -> { + IncrementMapValueWays ic = new IncrementMapValueWays(); + ic.charFrequencyWithConcurrentMap(" fox jumps over the lazy dog", charMap); + }); + + thread1.start(); + thread2.start(); + thread1.join(); + thread2.join(); + + Map expectedMap = getExpectedMap(); + Assert.assertEquals(expectedMap, charMap); + } + + private Map getExpectedMap() { + return Stream.of( + new Object[][] { { ' ', 8 }, { 'a', 1 }, { 'b', 1 }, { 'c', 1 }, { 'd', 1 }, { 'e', 3 }, { 'f', 1 }, { 'g', 1 }, { 'h', 2 }, { 'i', 1 }, { 'j', 1 }, { 'k', 1 }, { 'l', 1 }, { 'm', 1 }, { 'n', 1 }, { 'o', 4 }, { 'p', 1 }, { 'q', 1 }, { 'r', 2 }, + { 's', 1 }, { 't', 2 }, { 'u', 2 }, { 'v', 1 }, { 'w', 1 }, { 'x', 1 }, { 'y', 1 }, { 'z', 1 } }) + .collect(Collectors.toMap(data -> (Character) data[0], data -> (Integer) data[1])); + } +} From a7ab16d81e505a46c56ca25fa60c89a72893416d Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 20 Nov 2023 03:14:46 -0300 Subject: [PATCH 584/831] BAEL-6566: Manage Kafka Consumer Groups (#15007) * test removing consumer * test removing consumer * wrapping up * fix main class * addressing request changes * introducing constants for numbers. optimizing imports * introducing class level constants * using constant naming conventions --- .../KafkaConsumerConfiguration.java | 37 ++++++++++++ .../KafkaProducerConfiguration.java | 35 ++++++++++++ .../KafkaTopicConfiguration.java | 30 ++++++++++ ...gingConsumerGroupsApplicationKafkaApp.java | 13 +++++ .../MessageConsumerService.java | 34 +++++++++++ ...ManagingConsumerGroupsIntegrationTest.java | 57 +++++++++++++++++++ 6 files changed, 206 insertions(+) create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaConsumerConfiguration.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaProducerConfiguration.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaTopicConfiguration.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsApplicationKafkaApp.java create mode 100644 spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/MessageConsumerService.java create mode 100644 spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaConsumerConfiguration.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaConsumerConfiguration.java new file mode 100644 index 0000000000..04025bf484 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaConsumerConfiguration.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.DoubleDeserializer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConsumerConfiguration { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Bean + public ConsumerFactory kafkaConsumer() { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, DoubleDeserializer.class); + return new DefaultKafkaConsumerFactory<>(props); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaConsumerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(kafkaConsumer()); + return factory; + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaProducerConfiguration.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaProducerConfiguration.java new file mode 100644 index 0000000000..b5b10e8301 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaProducerConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.DoubleSerializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaProducerConfiguration { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + @Bean + public ProducerFactory kafkaProducer() { + Map configProps = new HashMap<>(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, DoubleSerializer.class); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaProducerTemplate() { + return new KafkaTemplate<>(kafkaProducer()); + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaTopicConfiguration.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaTopicConfiguration.java new file mode 100644 index 0000000000..1535f0c358 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/KafkaTopicConfiguration.java @@ -0,0 +1,30 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.apache.kafka.clients.admin.AdminClientConfig; +import org.apache.kafka.clients.admin.NewTopic; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.TopicBuilder; +import org.springframework.kafka.core.KafkaAdmin; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaTopicConfiguration { + + @Value(value = "${spring.kafka.bootstrap-servers}") + private String bootstrapAddress; + + public KafkaAdmin kafkaAdmin() { + Map configs = new HashMap<>(); + configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress); + return new KafkaAdmin(configs); + } + + public NewTopic celciusTopic() { + return TopicBuilder.name("topic-1") + .partitions(2) + .build(); + } +} diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsApplicationKafkaApp.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsApplicationKafkaApp.java new file mode 100644 index 0000000000..c5c990ff9d --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsApplicationKafkaApp.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; + +@SpringBootApplication +@Import(value = {KafkaConsumerConfiguration.class, KafkaProducerConfiguration.class, KafkaTopicConfiguration.class}) +public class ManagingConsumerGroupsApplicationKafkaApp { + public static void main(String[] args) { + SpringApplication.run(ManagingConsumerGroupsApplicationKafkaApp.class, args); + } +} \ No newline at end of file diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/MessageConsumerService.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/MessageConsumerService.java new file mode 100644 index 0000000000..d010b19a80 --- /dev/null +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/MessageConsumerService.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +@Service +public class MessageConsumerService { + + Map> consumedPartitions = new ConcurrentHashMap<>(); + + @KafkaListener(topics = "topic-1", groupId = "group-1") + public void consumer0(ConsumerRecord consumerRecord) { + trackConsumedPartitions("consumer-0", consumerRecord); + } + + @KafkaListener(topics = "topic-1", groupId = "group-1") + public void consumer1(ConsumerRecord consumerRecord) { + trackConsumedPartitions("consumer-1", consumerRecord); + } + + private void trackConsumedPartitions(String key, ConsumerRecord record) { + consumedPartitions.computeIfAbsent(key, k -> new HashSet<>()); + consumedPartitions.computeIfPresent(key, (k, v) -> { + v.add(record.partition()); + return v; + }); + } +} diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java new file mode 100644 index 0000000000..1620add9ca --- /dev/null +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.kafka.managingkafkaconsumergroups; + +import org.apache.commons.lang3.RandomUtils; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.kafka.test.context.EmbeddedKafka; + +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest(classes = ManagingConsumerGroupsApplicationKafkaApp.class) +@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9092", "port=9092"}) +public class ManagingConsumerGroupsIntegrationTest { + + private static final String CONSUMER_1_IDENTIFIER = "org.springframework.kafka.KafkaListenerEndpointContainer#1"; + private static final int TOTAL_PRODUCED_MESSAGES = 50000; + private static final int MESSAGE_WHERE_CONSUMER_1_LEAVES_GROUP = 10000; + + @Autowired + KafkaTemplate kafkaTemplate; + + @Autowired + KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry; + + @Autowired + MessageConsumerService consumerService; + + @Test + public void givenContinuousMessageFlow_whenAConsumerLeavesTheGroup_thenKafkaTriggersPartitionRebalance() throws InterruptedException { + int currentMessage = 0; + + do { + kafkaTemplate.send("topic-1", RandomUtils.nextDouble(10.0, 20.0)); + currentMessage++; + + if (currentMessage == MESSAGE_WHERE_CONSUMER_1_LEAVES_GROUP) { + String containerId = kafkaListenerEndpointRegistry.getListenerContainerIds() + .stream() + .filter(a -> a.equals(CONSUMER_1_IDENTIFIER)) + .findFirst() + .orElse(""); + MessageListenerContainer container = kafkaListenerEndpointRegistry.getListenerContainer(containerId); + Thread.sleep(2000); + Objects.requireNonNull(container).stop(); + kafkaListenerEndpointRegistry.unregisterListenerContainer(containerId); + } + } while (currentMessage != TOTAL_PRODUCED_MESSAGES); + Thread.sleep(2000); + assertEquals(1, consumerService.consumedPartitions.get("consumer-1").size()); + assertEquals(2, consumerService.consumedPartitions.get("consumer-0").size()); + } +} From 40315beb0df5754add38e8afaf8596ba8f620811 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Mon, 20 Nov 2023 11:44:00 +0200 Subject: [PATCH 585/831] JAVA-26733 Upgrade wiremock to the latest version (#15206) --- apache-httpclient/pom.xml | 10 ++++++++-- .../com/baeldung/httpclient/GetRequestMockServer.java | 2 +- .../baeldung/httpclient/HttpAsyncClientLiveTest.java | 6 ++---- .../java/com/baeldung/httpclient/ResponseUtil.java | 6 +++--- ...HttpClientAdvancedConfigurationIntegrationTest.java | 4 ++-- apache-httpclient4/pom.xml | 4 ++-- ...HttpClientAdvancedConfigurationIntegrationTest.java | 4 ++-- core-java-modules/core-java-httpclient/pom.xml | 4 ++-- core-java-modules/core-java-io-2/pom.xml | 5 ++--- httpclient-simple/pom.xml | 4 ++-- spring-jersey/pom.xml | 4 ++-- testing-modules/rest-testing/pom.xml | 4 ++-- 12 files changed, 30 insertions(+), 27 deletions(-) diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml index 1b22d64799..3b178d4df8 100644 --- a/apache-httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -58,11 +58,16 @@ - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test + + org.apache.httpcomponents + httpclient + ${httpclient.version} + @@ -77,11 +82,12 @@ 5.6.1 - 2.5.1 + 3.3.1 5.2 5.2 5.2 + 4.5.14 diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java index 92cb452dc8..1a4f4aebf3 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java @@ -8,7 +8,7 @@ import static org.mockserver.model.HttpResponse.response; import java.io.IOException; import java.net.ServerSocket; -import org.apache.http.HttpStatus; +import org.apache.hc.core5.http.HttpStatus; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.mockserver.client.MockServerClient; diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java index d421de1c7a..50cf1b7a64 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java @@ -38,8 +38,6 @@ import org.junit.jupiter.api.Test; class HttpAsyncClientLiveTest extends GetRequestMockServer { - - private static final String HOST = "http://www.google.com"; private static final String HOST_WITH_SSL = "https://mms.nw.ru/"; private static final String HOST_WITH_PROXY = "http://httpbin.org/"; private static final String URL_SECURED_BY_BASIC_AUTHENTICATION = "http://browserspy.dk/password-ok.php";// "http://localhost:8080/spring-security-rest-basic-auth/api/foos/1"; @@ -136,7 +134,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { client.start(); - final SimpleHttpRequest request = new SimpleHttpRequest("GET",HOST_WITH_SSL); + final SimpleHttpRequest request = new SimpleHttpRequest("GET", HOST_WITH_SSL); final Future future = client.execute(request, null); final HttpResponse response = future.get(); @@ -201,7 +199,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { @Override public void run() { try { - final Future future = client.execute(SimpleHttpRequest.copy(request), context, null); + final Future future = client.execute(SimpleRequestBuilder.copy(request).build(), context, null); final HttpResponse response = future.get(); assertThat(response.getCode(), equalTo(200)); } catch (final Exception ex) { diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java index e9ea08a723..537f501d93 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/ResponseUtil.java @@ -1,10 +1,10 @@ package com.baeldung.httpclient; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; - import java.io.IOException; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.core5.http.HttpEntity; + public final class ResponseUtil { private ResponseUtil() { } diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java index 3ac3ee88be..2a8665b624 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java @@ -103,7 +103,7 @@ class HttpClientAdvancedConfigurationIntegrationTest { void givenServerThatIsBehindProxy_whenClientIsConfiguredToSendRequestViaProxy_shouldReturn200() throws IOException { //given proxyMock.stubFor(get(urlMatching(".*")) - .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + .willReturn(aResponse().proxiedFrom("http://localhost:8089"))); serviceMock.stubFor(get(urlEqualTo("/private")) .willReturn(aResponse().withStatus(200))); @@ -129,7 +129,7 @@ class HttpClientAdvancedConfigurationIntegrationTest { public void givenServerThatIsBehindAuthorizationProxy_whenClientSendRequest_shouldAuthorizeProperly() throws IOException { //given proxyMock.stubFor(get(urlMatching("/private")) - .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + .willReturn(aResponse().proxiedFrom("http://localhost:8089"))); serviceMock.stubFor(get(urlEqualTo("/private")) .willReturn(aResponse().withStatus(200))); diff --git a/apache-httpclient4/pom.xml b/apache-httpclient4/pom.xml index 8b2fd76f0e..90890ef7b9 100644 --- a/apache-httpclient4/pom.xml +++ b/apache-httpclient4/pom.xml @@ -158,7 +158,7 @@ ${mockserver.version} - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -237,7 +237,7 @@ 1.16.0 4.1.5 - 2.5.1 + 3.3.1 4.4.16 4.5.14 5.11.2 diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java index 5ced756644..714c01192e 100644 --- a/apache-httpclient4/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/advancedconfig/HttpClientAdvancedConfigurationIntegrationTest.java @@ -102,7 +102,7 @@ class HttpClientAdvancedConfigurationIntegrationTest { void givenServerThatIsBehindProxy_whenClientIsConfiguredToSendRequestViaProxy_shouldReturn200() throws IOException { //given proxyMock.stubFor(get(urlMatching(".*")) - .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + .willReturn(aResponse().proxiedFrom("http://localhost:8089"))); serviceMock.stubFor(get(urlEqualTo("/private")) .willReturn(aResponse().withStatus(200))); @@ -128,7 +128,7 @@ class HttpClientAdvancedConfigurationIntegrationTest { void givenServerThatIsBehindAuthorizationProxy_whenClientSendRequest_shouldAuthorizeProperly() throws IOException { //given proxyMock.stubFor(get(urlMatching("/private")) - .willReturn(aResponse().proxiedFrom("http://localhost:8089/"))); + .willReturn(aResponse().proxiedFrom("http://localhost:8089"))); serviceMock.stubFor(get(urlEqualTo("/private")) .willReturn(aResponse().withStatus(200))); diff --git a/core-java-modules/core-java-httpclient/pom.xml b/core-java-modules/core-java-httpclient/pom.xml index f3730d1b45..fc95366392 100644 --- a/core-java-modules/core-java-httpclient/pom.xml +++ b/core-java-modules/core-java-httpclient/pom.xml @@ -32,7 +32,7 @@ test - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -58,7 +58,7 @@ 11 3.22.0 5.11.2 - 2.27.2 + 3.3.1 \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml index 8f4f2518fe..8632748baa 100644 --- a/core-java-modules/core-java-io-2/pom.xml +++ b/core-java-modules/core-java-io-2/pom.xml @@ -31,9 +31,8 @@ log4j-over-slf4j ${org.slf4j.version} - - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -63,7 +62,7 @@ 3.0.0-M1 - 2.26.3 + 3.3.1 \ No newline at end of file diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index 8cbc1237c2..a0f2dd6514 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/pom.xml @@ -99,7 +99,7 @@ ${commons-codec.version} - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -207,7 +207,7 @@ 1.16.0 - 2.5.1 + 3.3.1 5.2 5.2 diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 32f75aa676..9ea5f62778 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -85,7 +85,7 @@ ${jersey.version} - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -219,7 +219,7 @@ 1.6.1 4.4.9 4.5.5 - 2.27.2 + 3.3.1 1.5.10.RELEASE diff --git a/testing-modules/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml index f8005092ae..975b6fb647 100644 --- a/testing-modules/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -34,7 +34,7 @@ - com.github.tomakehurst + org.wiremock wiremock ${wiremock.version} test @@ -135,7 +135,7 @@ 2.9.0 6.8.0 - 2.21.0 + 3.3.1 1.3.1 4.1 From c10a404f57152bccaf50d097712f50700147e58f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 20 Nov 2023 10:58:10 +0000 Subject: [PATCH 586/831] [JAVA-26734] Upgraded aspectjrt, aspectjweaver to latest version (#15140) --- .../core-java-concurrency-advanced-3/pom.xml | 6 +++--- core-java-modules/core-java-os/pom.xml | 1 - .../core-java-time-measurements/pom.xml | 4 ++-- di-modules/cdi/pom.xml | 2 +- libraries-3/pom.xml | 6 +++--- parent-boot-2/pom.xml | 12 +++++++++++- spring-boot-modules/spring-boot-annotations/pom.xml | 1 - spring-boot-modules/spring-boot-mvc/pom.xml | 3 +-- spring-di/pom.xml | 2 +- spring-static-resources/pom.xml | 4 ++-- 10 files changed, 24 insertions(+), 17 deletions(-) diff --git a/core-java-modules/core-java-concurrency-advanced-3/pom.xml b/core-java-modules/core-java-concurrency-advanced-3/pom.xml index 7fa859c2d5..e3b399782e 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/pom.xml +++ b/core-java-modules/core-java-concurrency-advanced-3/pom.xml @@ -85,12 +85,12 @@ 1.8 1.8 0.22.6 - 1.9.5 + 1.9.20.1 0.43 1.2.3 0.14.1 - 1.9.1 - 1.9.1 + 1.9.20.1 + 1.9.20.1 \ No newline at end of file diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml index d4ee34b8b7..cd5b479974 100644 --- a/core-java-modules/core-java-os/pom.xml +++ b/core-java-modules/core-java-os/pom.xml @@ -75,7 +75,6 @@ 4.01 - 1.8.9 1.9 1.9 0.4 diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml index 7b2bc31ebb..2dd713efe8 100644 --- a/core-java-modules/core-java-time-measurements/pom.xml +++ b/core-java-modules/core-java-time-measurements/pom.xml @@ -33,7 +33,7 @@ org.aspectj aspectjrt - ${asspectj.version} + ${aspectj.version} org.mockito @@ -74,7 +74,7 @@ 3.6.1 2.10 - 1.8.9 + 1.9.20.1 1.44 4.1.0 diff --git a/di-modules/cdi/pom.xml b/di-modules/cdi/pom.xml index fd920c8ce1..09f69f3dc3 100644 --- a/di-modules/cdi/pom.xml +++ b/di-modules/cdi/pom.xml @@ -59,7 +59,7 @@ 2.0.SP1 3.1.6.Final - 1.9.19 + 1.9.20.1 \ No newline at end of file diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index 8d45b95a7b..9923e46267 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -219,10 +219,10 @@ 2.7.2 1.2.3.Final 0.22.6 - 1.9.2 + 1.9.20.1 0.14.1 - 1.9.2 - 1.9.2 + 1.9.20.1 + 1.9.20.1 1.19 4.4.13 4.5.12 diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 3f6ad8ef8a..b79be81a66 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -36,6 +36,16 @@ pom import + + org.aspectj + aspectjrt + ${aspectj.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + @@ -95,7 +105,7 @@ 1.0.22.RELEASE 2.7.11 - 1.9.1 + 1.9.20.1 8.0.31 diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml index 91f2614de8..13a28cbd4e 100644 --- a/spring-boot-modules/spring-boot-annotations/pom.xml +++ b/spring-boot-modules/spring-boot-annotations/pom.xml @@ -17,7 +17,6 @@ org.aspectj aspectjweaver - ${aspectjweaver.version} org.springframework.boot diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml index a251c5049b..963cda61b9 100644 --- a/spring-boot-modules/spring-boot-mvc/pom.xml +++ b/spring-boot-modules/spring-boot-mvc/pom.xml @@ -84,12 +84,10 @@ org.aspectj aspectjrt - ${aspectjweaver.version} org.aspectj aspectjweaver - ${aspectjweaver.version} org.projectlombok @@ -114,6 +112,7 @@ 1.10.0 2.3.7 + 1.9.20.1 com.baeldung.springbootmvc.SpringBootMvcApplication diff --git a/spring-di/pom.xml b/spring-di/pom.xml index bae7263ef9..d073f5359d 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -134,7 +134,7 @@ org.baeldung.org.baeldung.sample.App 3.1.2 - 1.9.5 + 1.9.20.1 \ No newline at end of file diff --git a/spring-static-resources/pom.xml b/spring-static-resources/pom.xml index 875b8de31b..2bf865ddbe 100644 --- a/spring-static-resources/pom.xml +++ b/spring-static-resources/pom.xml @@ -88,7 +88,7 @@ org.aspectj aspectjrt - ${org.aspectj-version} + ${aspectj.version} javax.inject @@ -186,7 +186,7 @@ - 1.8.9 + 1.9.20.1 8.0.1.Final 4.1.0 From 0847a0b8cee1daf773e152a7d4f051ec41633457 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 20 Nov 2023 18:54:59 +0530 Subject: [PATCH 587/831] JAVA-26713 Upgrade spring-boot-starter-validation version --- javaxval-2/pom.xml | 23 +++++++++++-------- ...entDeserializerWithValidationUnitTest.java | 2 +- javaxval/pom.xml | 8 +++---- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index f73f23bcb2..366fd9fdbf 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -9,26 +9,24 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-boot-3 + 0.0.1-SNAPSHOT + ../parent-boot-3 org.springframework.boot spring-boot-starter-validation - ${spring.boot.version} org.springframework.boot spring-boot-starter-test - ${spring.boot.version} test com.fasterxml.jackson.core jackson-databind - ${jackson.databind.version} @@ -42,9 +40,16 @@ - - 3.0.4 - 2.14.0 - + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + \ No newline at end of file diff --git a/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java index 094236e963..8c3761ae09 100644 --- a/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javaxval; +package com.baeldung.javaxval.afterdeserialization; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/javaxval/pom.xml b/javaxval/pom.xml index c4a30f915d..e1a3dc350c 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -8,20 +8,19 @@ com.baeldung - parent-modules - 1.0.0-SNAPSHOT + parent-boot-3 + 0.0.1-SNAPSHOT + ../parent-boot-3 org.springframework.boot spring-boot-starter-validation - ${spring.boot.version} org.springframework.boot spring-boot-starter-test - ${spring.boot.version} test @@ -38,7 +37,6 @@ 8.0.1.Final - 3.0.4 \ No newline at end of file From a3e0639a75506908027421d647c50704dd882edd Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Mon, 20 Nov 2023 19:18:13 +0200 Subject: [PATCH 588/831] This commit is related to the article BAEL-7232 (#15252) This commit adds a new test class "TimeToLocalDateTimeUnitTest" that shows how to convert a long timestamp into a LocalDateTime object. --- .../TimeToLocalDateTimeUnitTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolocaldatetime/TimeToLocalDateTimeUnitTest.java diff --git a/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolocaldatetime/TimeToLocalDateTimeUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolocaldatetime/TimeToLocalDateTimeUnitTest.java new file mode 100644 index 0000000000..e8fb821c75 --- /dev/null +++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/timestamptolocaldatetime/TimeToLocalDateTimeUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.timestamptolocaldatetime; + +import org.joda.time.DateTimeZone; +import org.junit.Test; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; + +import static org.junit.Assert.assertEquals; + +public class TimeToLocalDateTimeUnitTest { + private static final long timestampInMillis = 1700010123000L; + private static final String expectedTimestampString = "2023-11-15 01:02:03"; + + @Test + public void givenTimestamp_whenConvertingToLocalDateTime_thenConvertSuccessfully() { + Instant instant = Instant.ofEpochMilli(timestampInMillis); + LocalDateTime localDateTime = + LocalDateTime.ofInstant(instant, ZoneId.of("UTC")); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateTime = localDateTime.format(formatter); + + assertEquals(expectedTimestampString, formattedDateTime); + } + + @Test + public void givenJodaTime_whenGettingTimestamp_thenConvertToLong() { + DateTime dateTime = new DateTime(timestampInMillis, DateTimeZone.UTC); + org.joda.time.LocalDateTime localDateTime = dateTime.toLocalDateTime(); + + org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); + String actualTimestamp = formatter.print(localDateTime); + + assertEquals(expectedTimestampString, actualTimestamp); + } +} From ec1fde9dc1e03cf83678f194b29c4c6b437a0e84 Mon Sep 17 00:00:00 2001 From: Constantin Date: Mon, 20 Nov 2023 14:36:44 +0200 Subject: [PATCH 589/831] BAEL-6014: Check certificate name and alias in keystore file --- .../KeystoreCertificateNameAliasUnitTest.java | 50 ++++++++++++++++++ .../baeldung/keystorealias/my-keystore.jks | Bin 0 -> 2764 bytes 2 files changed, 50 insertions(+) create mode 100644 core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java create mode 100644 core-java-modules/core-java-security-4/src/test/resources/com/baeldung/keystorealias/my-keystore.jks diff --git a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java new file mode 100644 index 0000000000..47bc4c3425 --- /dev/null +++ b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.keystorealias; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.security.KeyStore; +import java.security.cert.X509Certificate; + +import org.junit.jupiter.api.Test; + +public class KeystoreCertificateNameAliasUnitTest { + private static final String KEYSTORE_FILE = "my-keystore.jks"; + private static final String KEYSTORE_PWD = "storepw@1"; + private static final String KEYSTORE_ALIAS = "baeldung"; + + private KeyStore readKeyStore() throws Exception { + KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); + keystore.load(getClass().getResourceAsStream(KEYSTORE_FILE), KEYSTORE_PWD.toCharArray()); + return keystore; + } + + @Test + void whenCheckingAliasAndName_thenMatchIsFound() throws Exception { + KeyStore keystore = readKeyStore(); + + assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); + + X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); + String owner = x509Certificate.getSubjectX500Principal().getName(); + assertThat(owner.contains("my-cn.localhost")).isTrue(); + } + + @Test + void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); + + assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); + + X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); + String owner = x509Certificate.getSubjectX500Principal() + .getName(); + assertThat(owner.contains("commonName1")).isFalse(); + } + + @Test + void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); + + assertThat(keystore.containsAlias("alias1")).isFalse(); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-security-4/src/test/resources/com/baeldung/keystorealias/my-keystore.jks b/core-java-modules/core-java-security-4/src/test/resources/com/baeldung/keystorealias/my-keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..8f7709ee9656d443f21a53170449736898f0325b GIT binary patch literal 2764 zcma);S5y-W5`~kHMsGnRg0xViXoB?K1q?+g(wh*9G%3{r zC<2DAfb^zdp(#OBSoiE6|FciK4|C?soqOl;JA=kE4S;|QXgpIelu?RcM4+<*VL%d| z={gwCXlBRO&d=MMuWX=da_eb-q(?9bFV!6WW*!0{X_kG9svM) z?xUJzn&1b&{VUdNM9G;;Q(?tiGM+n+TxiEM{FlaCH94FY;BeXEqBcuh;X`KI!E!a~ z`dNv*29>23L_{zT3m*oW4slqpoS#DtCD;#d%*@x!M>@+HvQBJyIL$J^15#c#aER3lr{W{9H%Ms|L|B zIn-x~`K0MlRqK;7&MmoP__V$)XVZlJU_9N~StOx0e!SStk6c<#zYW=Y@uTscD{^bY zWVs$vq-hep-{`QoI(@gwBntI~W>j4DI(4waP>N8W5c8d8UgS)``u2qk`J7fzoZI!Cu!PMEqcZd#$zVwm0H-c^yXWAUpQlL4n9<8lfcFtbeJKe zVGl}wd~SRWOG2-EXeK|Dx$XmB`szEuf1ScQ?5;m(NUbvQ2(+8abHgULF+5^ZOEvdU zD3ml{^YDBq$e29yk%&5*l zpqpNA_OFEdbI5Gxxatp5YXTwiNh%h%*XQPsj=eI~<$RbtS`Z1JGKqU$jpo{lhi^aj zL_*8*r?NXo>@*4E?$uQp@EkS+26)uK;E~HrNE^5B zxO~oKn}r$|JJN2rgHxX2l43KKc9`AoT4^wsieIyglL}8H%J5h@h+=HBA7g^X3D#3c ztL)a5WJ0d>&d<6m&C5BQHjv2-oRs#&yPBWdLD3Xbk&sq)_Ell!+kQN=nsd>p5-Zcg z%pPORJaT>VNv@dw+cj8u=Tn`6CNlv&*;B4;(8IXlXE{6grl!#zhl}gH2jl~UxdG2a z2L-k))S#Xi2gUK89@;$1HdcGmIe9-iB_dIC5b5E@>~v$jY4iz~fzA#|*!I()`ngB< zD0Su;Pfj5g|oyK>?#eXR3%Zr1Q7O_%( z4;-CBa=OXE6zWF%(Bf;jYL_B^6~c+!YHB9@=A&d z3UZ2a%4j^e?2icsCE>wYzook%AmDdP{(A%bU#Nc1H(f)Iu-qPp4J0~RBJyyX8L{ENv;c9+K}{&!9EQc^z`jEhgwO_s%?5tW?et!Td)F<=kmZPue|)|XZpPwHhZl7UrE z5Bri;9?m}XwgCEbkJ5se14(Yzqsr$`kXJ`RvyE$Kd?nd>(T`4wBy|BUE~Q_RK3Dcc>t8{K3@>_B3moTdEejCRja_cK$r;B}L zXUP3m>&KX_$nT^M8w~tfN-oW>w)|(PqAXF$?kjfbOUn_>03)6FVM70$rR1A6!5gy1 zmH0Ba8QRUNXE?gGy6?1OGux?3$ONHY6jLZ>+BclMuChD2b6W{3pXZ9IMyv!&#Mvl3 zE-LMg@60T>AC0!U3txI#U5RZ^SJ}CJCY_FYe@oelsu8poYORX6qX+fs-B*p_6<{Yn zD1eY49`Nb?`3j-Kfd@kGw9_I!HmZQ;yn2*i<0q1N6|I4I7t!5x^~i0a1?A;{2o7WW zPSvL@iH-Vg5rvD{vK&@b-4}prL9>6gjX%R8machpgIoFcIsuQ8jn4PaYJmsm>xxi5 z>Nr&@ea6qKHhv(33i=@}3aJet8th$V3}APO7aZvtsLee^b>+V95-ah50cVuF?BMH0 zaP9Hh9TDZcQm8MR-#@Xh$-y6BGdWWwbrI@IyzJtjTI+9urXEbfNQR=#pKi8r4~ZYU zJR2iDnR&r4Vj03x-5gBw-E!G%$zu^wYIc$FS$cIW9laj*-YXLon)Q|k`MmuaKfgMu z*ZRxpQ_r;)+~Gu$l1ga+EHtCGZ*%3lSz_^>nr7AMpzUXnhCT1e5{1ucmO+5$zJG;^ zZ6`QtoD9CMqM;%c37+QE0Abd2{To5*`=#QJx{J^i=B?m^!1L9zdf1ANdwnh&DxI(5!zxJP;5901MR*oaT&uZ*eCJ>8i8%J%Pi& s4Oyc}^70n{XjUP7XTl7O;75 Date: Mon, 20 Nov 2023 20:12:51 +0200 Subject: [PATCH 590/831] BAEL-6014: Remove newline --- .../keystorealias/KeystoreCertificateNameAliasUnitTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java index 47bc4c3425..26bd937ca4 100644 --- a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java +++ b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java @@ -36,8 +36,7 @@ public class KeystoreCertificateNameAliasUnitTest { assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); - String owner = x509Certificate.getSubjectX500Principal() - .getName(); + String owner = x509Certificate.getSubjectX500Principal().getName(); assertThat(owner.contains("commonName1")).isFalse(); } From 34754e74ad17231b515fd8f25da96a8fd0f44858 Mon Sep 17 00:00:00 2001 From: Constantin Date: Mon, 20 Nov 2023 22:12:10 +0200 Subject: [PATCH 591/831] BAEL-6014: Address PR comments --- .../KeystoreCertificateNameAliasUnitTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java index 26bd937ca4..e53c1c57cb 100644 --- a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java +++ b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java @@ -25,25 +25,25 @@ public class KeystoreCertificateNameAliasUnitTest { assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); - String owner = x509Certificate.getSubjectX500Principal().getName(); - assertThat(owner.contains("my-cn.localhost")).isTrue(); + String ownerName = x509Certificate.getSubjectX500Principal().getName(); + assertThat(ownerName.contains("my-cn.localhost")).isTrue(); } - @Test - void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception { - KeyStore keystore = readKeyStore(); +@Test +void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); - assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); + assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); - X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); - String owner = x509Certificate.getSubjectX500Principal().getName(); - assertThat(owner.contains("commonName1")).isFalse(); - } + X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); + String ownerName = x509Certificate.getSubjectX500Principal().getName(); + assertThat(ownerName.contains("commonName1")).isFalse(); +} - @Test - void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception { - KeyStore keystore = readKeyStore(); +@Test +void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); - assertThat(keystore.containsAlias("alias1")).isFalse(); - } + assertThat(keystore.containsAlias("alias1")).isFalse(); +} } \ No newline at end of file From 0bf89cfe37de372f25b378ca0aa02aa8a10e3ea6 Mon Sep 17 00:00:00 2001 From: Constantin Date: Mon, 20 Nov 2023 22:28:07 +0200 Subject: [PATCH 592/831] BAEL-6014: Fix formatting --- .../KeystoreCertificateNameAliasUnitTest.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java index e53c1c57cb..8f3ec35160 100644 --- a/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java +++ b/core-java-modules/core-java-security-4/src/test/java/com/baeldung/keystorealias/KeystoreCertificateNameAliasUnitTest.java @@ -29,21 +29,21 @@ public class KeystoreCertificateNameAliasUnitTest { assertThat(ownerName.contains("my-cn.localhost")).isTrue(); } -@Test -void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception { - KeyStore keystore = readKeyStore(); + @Test + void whenCheckingAliasAndName_thenNameIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); - assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); + assertThat(keystore.containsAlias(KEYSTORE_ALIAS)).isTrue(); - X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); - String ownerName = x509Certificate.getSubjectX500Principal().getName(); - assertThat(ownerName.contains("commonName1")).isFalse(); -} + X509Certificate x509Certificate = (X509Certificate) keystore.getCertificate(KEYSTORE_ALIAS); + String ownerName = x509Certificate.getSubjectX500Principal().getName(); + assertThat(ownerName.contains("commonName1")).isFalse(); + } -@Test -void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception { - KeyStore keystore = readKeyStore(); + @Test + void whenCheckingAliasAndName_thenAliasIsNotFound() throws Exception { + KeyStore keystore = readKeyStore(); - assertThat(keystore.containsAlias("alias1")).isFalse(); -} + assertThat(keystore.containsAlias("alias1")).isFalse(); + } } \ No newline at end of file From 111dcccb922f20b2fb7865a973d0ba7eac6a195e Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:28:10 +0100 Subject: [PATCH 593/831] Bael 7060 (#15247) * BAEL-7060: Converting String to ByteBuffer * BAEL-7060: Converting String to ByteBuffer (format code) --- .../ByteArrayToStringUnitTest.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java index c498921d9a..c54bb1236e 100644 --- a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java +++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java @@ -1,12 +1,12 @@ package com.baeldung.bytebuffertostring; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.Test; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; public class ByteArrayToStringUnitTest { private static Charset charset = StandardCharsets.UTF_8; @@ -37,8 +37,17 @@ public class ByteArrayToStringUnitTest { // Allocate a ByteBuffer ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes()); String newContent = charset.decode(byteBuffer) - .toString(); + .toString(); assertEquals(content, newContent); } + @Test + public void convertStringToByteBuffer_thenOk() { + byte[] expectedBytes = content.getBytes(Charset.forName(charset.toString())); + ByteBuffer byteBuffer = ByteBuffer.wrap(expectedBytes); + + // Test the conversion from string to ByteBuffer + assertEquals(expectedBytes, byteBuffer.array()); + } + } From 85c4c1450b68d7dbcc0bdf95daa210d3341be137 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 20 Nov 2023 19:43:54 -0300 Subject: [PATCH 594/831] BAEL-2499 - Write to CSV in Java Closes #15250 Adding a null check. --- .../src/main/java/com/baeldung/csv/WriteCsvFileExample.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/csv/WriteCsvFileExample.java b/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/csv/WriteCsvFileExample.java index f409d05b06..184ae6d3e3 100644 --- a/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/csv/WriteCsvFileExample.java +++ b/core-java-modules/core-java-io-conversions-2/src/main/java/com/baeldung/csv/WriteCsvFileExample.java @@ -12,6 +12,10 @@ public class WriteCsvFileExample { } public String escapeSpecialCharacters(String data) { + if (data == null) { + throw new IllegalArgumentException("Input data cannot be null"); + } + String escapedData = data.replaceAll("\\R", " "); if (data.contains(",") || data.contains("\"") || data.contains("'")) { data = data.replace("\"", "\"\""); From 94595ea00060ca94784f60a94c523074aaecf8e7 Mon Sep 17 00:00:00 2001 From: Shahul Basha <32072554+shahulbasha@users.noreply.github.com> Date: Mon, 20 Nov 2023 21:50:44 -0500 Subject: [PATCH 595/831] BAEL-7016 (#15050) * initial commit * initial commit * code cleanup * code cleanup * code cleanup * code cleanup * code review comments addressed * pom version * code review comments * formatting updated * updated as per code review comments --- xml-2/pom.xml | 12 ++ .../com/baeldung/xml/tohashmap/Employee.java | 31 +++++ .../com/baeldung/xml/tohashmap/Employees.java | 21 +++ .../baeldung/xml/tohashmap/XmlToHashMap.java | 124 ++++++++++++++++++ .../main/resources/xml/xmltohashmap/test.xml | 12 ++ .../xml/tohashmap/XmlToHashMapUnitTest.java | 71 ++++++++++ 6 files changed, 271 insertions(+) create mode 100644 xml-2/src/main/java/com/baeldung/xml/tohashmap/Employee.java create mode 100644 xml-2/src/main/java/com/baeldung/xml/tohashmap/Employees.java create mode 100644 xml-2/src/main/java/com/baeldung/xml/tohashmap/XmlToHashMap.java create mode 100644 xml-2/src/main/resources/xml/xmltohashmap/test.xml create mode 100644 xml-2/src/test/java/com/baeldung/xml/tohashmap/XmlToHashMapUnitTest.java diff --git a/xml-2/pom.xml b/xml-2/pom.xml index 0f94588ba0..ccb84e1687 100644 --- a/xml-2/pom.xml +++ b/xml-2/pom.xml @@ -46,6 +46,16 @@ underscore ${underscore.version} + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + com.sun.xml.bind + jaxb-impl + ${jaxb.version} + org.apache.xmlbeans xmlbeans @@ -82,6 +92,8 @@ 2.1.3 20230227 1.89 + 1.4.18 + 2.3.3 diff --git a/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employee.java b/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employee.java new file mode 100644 index 0000000000..c9c40e743a --- /dev/null +++ b/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employee.java @@ -0,0 +1,31 @@ +package com.baeldung.xml.tohashmap; + +public class Employee { + private String id; + private String firstName; + private String lastName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employees.java b/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employees.java new file mode 100644 index 0000000000..d2f2276e5c --- /dev/null +++ b/xml-2/src/main/java/com/baeldung/xml/tohashmap/Employees.java @@ -0,0 +1,21 @@ +package com.baeldung.xml.tohashmap; + +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "employees") +public class Employees { + + private List employeeList; + + @XmlElement(name = "employee") + public List getEmployeeList() { + return employeeList; + } + + public void setEmployeeList(List employeeList) { + this.employeeList = employeeList; + } +} \ No newline at end of file diff --git a/xml-2/src/main/java/com/baeldung/xml/tohashmap/XmlToHashMap.java b/xml-2/src/main/java/com/baeldung/xml/tohashmap/XmlToHashMap.java new file mode 100644 index 0000000000..ec651486ac --- /dev/null +++ b/xml-2/src/main/java/com/baeldung/xml/tohashmap/XmlToHashMap.java @@ -0,0 +1,124 @@ +package com.baeldung.xml.tohashmap; + +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.github.underscore.U; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.security.AnyTypePermission; + +public class XmlToHashMap { + + public Map xmlToHashMapUsingXstream(String xml) { + XStream xStream = new XStream(); + xStream.alias("employees", List.class); + xStream.alias("employee", Employee.class); + xStream.addPermission(AnyTypePermission.ANY); + List employees = (List) xStream.fromXML(xml); + return employees.stream() + .collect(Collectors.toMap(Employee::getId, Function.identity())); + } + + public Map xmlToHashMapUsingUnderscore(String xml) { + Map employeeMap = new HashMap<>(); + Map employeeList = (Map) U.fromXmlMap(xml) + .get("employees"); + List> list = (List>) employeeList.get("employee"); + parseXmlToMap(employeeMap, list); + return employeeMap; + } + + public Map xmlToHashMapUsingJackson(String xml) throws JsonProcessingException { + XmlMapper xmlMapper = new XmlMapper(); + Map employeeMap = new HashMap<>(); + Map map = xmlMapper.readValue(xml, Map.class); + List> list = (List>) map.get("employee"); + parseXmlToMap(employeeMap, list); + return employeeMap; + } + + public Map xmlToHashMapUsingJAXB(String xmlData) throws JAXBException { + JAXBContext context = JAXBContext.newInstance(Employees.class); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Employees employees = (Employees) unmarshaller.unmarshal(new StringReader(xmlData)); + return employees.getEmployeeList() + .stream() + .collect(Collectors.toMap(Employee::getId, Function.identity())); + } + + public Map xmlToHashMapUsingDOMParserXpath(String xmlData) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(new InputSource(new StringReader(xmlData))); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + XPathExpression xPathExpr = xpath.compile("/employees/employee"); + NodeList nodes = (NodeList) xPathExpr.evaluate(doc, XPathConstants.NODESET); + + HashMap map = new HashMap<>(); + for (int i = 0; i < nodes.getLength(); i++) { + Element node = (Element) nodes.item(i); + Employee employee = new Employee(); + employee.setId(node.getElementsByTagName("id") + .item(0) + .getTextContent()); + employee.setFirstName(node.getElementsByTagName("firstName") + .item(0) + .getTextContent()); + employee.setLastName(node.getElementsByTagName("lastName") + .item(0) + .getTextContent()); + map.put(employee.getId(), employee); + } + return map; + } + + private static void parseXmlToMap(Map employeeMap, List> list) { + list.forEach(empMap -> { + Employee employee = new Employee(); + for (Map.Entry key : empMap.entrySet()) { + switch (key.getKey()) { + case "id": + employee.setId(key.getValue()); + break; + case "firstName": + employee.setFirstName(key.getValue()); + break; + case "lastName": + employee.setLastName(key.getValue()); + break; + default: + break; + } + } + employeeMap.put(employee.getId(), employee); + }); + } +} diff --git a/xml-2/src/main/resources/xml/xmltohashmap/test.xml b/xml-2/src/main/resources/xml/xmltohashmap/test.xml new file mode 100644 index 0000000000..ef0d12e2af --- /dev/null +++ b/xml-2/src/main/resources/xml/xmltohashmap/test.xml @@ -0,0 +1,12 @@ + + + 654 + John + Doe + + + 776 + Steve + Smith + + \ No newline at end of file diff --git a/xml-2/src/test/java/com/baeldung/xml/tohashmap/XmlToHashMapUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/tohashmap/XmlToHashMapUnitTest.java new file mode 100644 index 0000000000..5e05dd3ccb --- /dev/null +++ b/xml-2/src/test/java/com/baeldung/xml/tohashmap/XmlToHashMapUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.xml.tohashmap; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Map; + +import javax.xml.bind.JAXBException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class XmlToHashMapUnitTest { + + private XmlToHashMap xmlToHashMap; + private static final String TEST_XML_PATH = "src/main/resources/xml/xmltohashmap/test.xml"; + + @BeforeEach + void setUp() { + xmlToHashMap = new XmlToHashMap(); + } + + @Test + void whenUsingXstream_thenHashMapShouldBeCreated() throws IOException { + Map employeeMap = xmlToHashMap.xmlToHashMapUsingXstream(getXml()); + verify(employeeMap); + } + + @Test + void whenUsingUnderscore_thenHashMapShouldBeCreated() throws IOException { + Map employeeMap = xmlToHashMap.xmlToHashMapUsingUnderscore(getXml()); + verify(employeeMap); + } + + @Test + void whenUsingJackson_thenHashMapShouldBeCreated() throws IOException { + Map employeeMap = xmlToHashMap.xmlToHashMapUsingJackson(getXml()); + verify(employeeMap); + } + + @Test + void whenUsingJAXB_thenHashMapShouldBeCreated() throws IOException, JAXBException { + Map employeeMap = xmlToHashMap.xmlToHashMapUsingJAXB(getXml()); + verify(employeeMap); + } + + @Test + void whenUsingDOMXpath_thenHashMapShouldBeCreated() throws Exception { + Map employeeMap = xmlToHashMap.xmlToHashMapUsingDOMParserXpath(getXml()); + verify(employeeMap); + } + + private void verify(Map employeeMap) { + Employee employee1 = employeeMap.get("654"); + Employee employee2 = employeeMap.get("776"); + Assertions.assertEquals("John", employee1 + .getFirstName()); + Assertions.assertEquals("Doe", employee1 + .getLastName()); + Assertions.assertEquals("Steve", employee2 + .getFirstName()); + Assertions.assertEquals("Smith", employee2 + .getLastName()); + } + + private String getXml() throws IOException { + return new String(Files.readAllBytes(Paths.get(TEST_XML_PATH))); + } +} From 9c995714f78f6715d0b99586c1f12e422ecca545 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 04:47:17 +0100 Subject: [PATCH 596/831] JAVA-26732: Update the equalsverifier dependency --- core-java-modules/core-java-lang-oop-methods/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml index 6f246d78ce..5e53004d62 100644 --- a/core-java-modules/core-java-lang-oop-methods/pom.xml +++ b/core-java-modules/core-java-lang-oop-methods/pom.xml @@ -35,7 +35,7 @@ 2.6 3.10.0 - 3.0.3 + 3.15.3 \ No newline at end of file From 0a3b02fd2411eec6b5fd959a30711c6b5a91e031 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 05:48:43 +0100 Subject: [PATCH 597/831] JAVA-26765: Update spring-boot-data-3 to new mysql connector --- spring-boot-modules/spring-boot-data-3/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index 6c2edbb864..7c0f4b3ffd 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung spring-boot-data-3 @@ -30,8 +30,8 @@ ${aws-secretsmanager-jdbc.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From ddf0c7bef89e971decbfc62f19afdecc5a79ec04 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 05:55:12 +0100 Subject: [PATCH 598/831] JAVA-26765: Update design-patterns-architectural to new mysql connector --- patterns-modules/design-patterns-architectural/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index 4efcca0c6b..addcdfe390 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/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 design-patterns-architectural 1.0 @@ -36,8 +36,8 @@ ${hibernate-core.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} jar @@ -65,7 +65,7 @@ 5.2.16.Final - 6.0.6 + 8.2.0 2.7.5 5.3.0 2.7.5 From 2dd443b291dd0d7846fd4ff9c14c843e50acf08c Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:00:50 +0100 Subject: [PATCH 599/831] JAVA-26765: Update jhipster-6/bookstore-monolith to new mysql connector --- jhipster-6/bookstore-monolith/pom.xml | 70 +++++++++++++-------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index a35abb9c19..2a5368c9ac 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -90,10 +90,10 @@ io.springfox springfox-bean-validators - - - - + + + + com.zaxxer HikariCP @@ -107,8 +107,8 @@ commons-lang3 - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.assertj @@ -136,10 +136,10 @@ net.logstash.logback logstash-logback-encoder - - - - + + + + org.mapstruct mapstruct @@ -423,28 +423,28 @@ jib-maven-plugin ${jib-maven-plugin.version} - - openjdk:8-jre-alpine - - - bookstore:latest - - - - sh - - chmod +x /entrypoint.sh && sync && /entrypoint.sh - - - 8080 - - - ALWAYS - 0 - - true - - + + openjdk:8-jre-alpine + + + bookstore:latest + + + + sh + + chmod +x /entrypoint.sh && sync && /entrypoint.sh + + + 8080 + + + ALWAYS + 0 + + true + + org.liquibase @@ -1137,9 +1137,9 @@ jdt_apt false - - - + + + 3.0.1 From d4b7888a6e0172568e29185e6b55e6546468f4cb Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:05:05 +0100 Subject: [PATCH 600/831] JAVA-26765: Update spring-cloud-modules/spring-cloud-vault to new mysql connector --- spring-cloud-modules/spring-cloud-vault/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-vault/pom.xml b/spring-cloud-modules/spring-cloud-vault/pom.xml index e4cf020986..58a28bdf5a 100644 --- a/spring-cloud-modules/spring-cloud-vault/pom.xml +++ b/spring-cloud-modules/spring-cloud-vault/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 com.baeldung.spring.cloud spring-cloud-vault @@ -42,8 +42,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.boot From 9b0e3227bee652018b3d51b0772b8d28ec0522f0 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:08:12 +0100 Subject: [PATCH 601/831] JAVA-26765: Update spring-cloud-modules/spring-cloud-aws to new mysql connector --- spring-cloud-modules/spring-cloud-aws/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-aws/pom.xml b/spring-cloud-modules/spring-cloud-aws/pom.xml index ff376b02cb..328ddd50de 100644 --- a/spring-cloud-modules/spring-cloud-aws/pom.xml +++ b/spring-cloud-modules/spring-cloud-aws/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 com.baeldung.spring.cloud spring-cloud-aws @@ -69,8 +69,8 @@ postgresql - mysql - mysql-connector-java + com.mysql + mysql-connector-j From ec40d41eb1821ed3e46c59407a3c11c43a95200b Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:14:18 +0100 Subject: [PATCH 602/831] JAVA-26765: Update spring-cloud-modules/spring-cloud-task/springcloudtaskbatch to new mysql connector --- .../spring-cloud-task/springcloudtaskbatch/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml index 7dbbb27a77..f7c13e881f 100644 --- a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/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 com.baeldung.cloud springcloudtaskbatch @@ -23,8 +23,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.springframework.cloud From 64006c8374890ba880993e3fc86d8e21d6fd90f7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:17:34 +0100 Subject: [PATCH 603/831] JAVA-26765: Update web-modules/vraptor to new mysql connector --- web-modules/vraptor/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml index 25f8b5d5e5..b26a29e004 100644 --- a/web-modules/vraptor/pom.xml +++ b/web-modules/vraptor/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 vraptor vraptor @@ -80,8 +80,8 @@ ${vraptor-hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} @@ -118,7 +118,7 @@ 8.0.1.Final 4.1.0-RC3 4.0.4 - 8.0.8-dmr + 8.2.0 0.4 2.3.27-incubating 2.1 From 215a61c122e5a78fbfc56dbe5e2cdf6afef2dc79 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:23:59 +0100 Subject: [PATCH 604/831] JAVA-26765: Update web-modules/java-lite to new mysql connector --- web-modules/java-lite/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web-modules/java-lite/pom.xml b/web-modules/java-lite/pom.xml index 7f1c9182f7..024d38420e 100644 --- a/web-modules/java-lite/pom.xml +++ b/web-modules/java-lite/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 org.baeldung java-lite @@ -22,8 +22,8 @@ ${activeweb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.java.version} @@ -88,7 +88,7 @@ 9.4.8.v20171121 1.4.13 1.15 - 5.1.45 + 8.2.0 1.7.0 1.15 From 275de7fd815cbc42fad50e29388f0bb98266a3a7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:27:21 +0100 Subject: [PATCH 605/831] JAVA-26765: Update spring-security-web-boot-1 to new mysql connector --- .../spring-security-web-boot-1/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index 08adb700ec..baa9f8e1e5 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/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-web-boot-1 0.0.1-SNAPSHOT @@ -45,8 +45,8 @@ spring-security-data - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From a76341d307fa6c464201edcf7f1a0ec3362394e6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 06:30:57 +0100 Subject: [PATCH 606/831] JAVA-26765: Update spring-security-web-boot-2 to new mysql connector --- .../spring-security-web-boot-2/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index 2255f8b035..7dcba3cd3e 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-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-web-boot-2 0.0.1-SNAPSHOT @@ -45,8 +45,8 @@ spring-security-data - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 923556ea274f141a02b9eca22b414961f9c94664 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Tue, 21 Nov 2023 16:22:50 +0530 Subject: [PATCH 607/831] Java 27246 (#15255) --- core-java-modules/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index a237fe0ed6..27d84c742d 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -198,7 +198,8 @@ core-java-records core-java-9-jigsaw - + + core-java-collections-set core-java-date-operations-1 core-java-datetime-conversion From ea7466682bd16d35e126ab859662d1d0b3783782 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 21 Nov 2023 11:39:23 -0300 Subject: [PATCH 608/831] BAEL-7178: StringUtils.isBlank() vs String.isEmpty() (#15213) * adding first test cases * final code --- .../StringIsEmptyVsIsBlankUnitTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/isemptyvsisblank/StringIsEmptyVsIsBlankUnitTest.java diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/isemptyvsisblank/StringIsEmptyVsIsBlankUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/isemptyvsisblank/StringIsEmptyVsIsBlankUnitTest.java new file mode 100644 index 0000000000..f6950237c5 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/isemptyvsisblank/StringIsEmptyVsIsBlankUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.isemptyvsisblank; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class StringIsEmptyVsIsBlankUnitTest { + + @Test + public void givenString_whenCallIsEmpty_thenReturnCorrectValues() { + assertFalse("Example text".isEmpty()); + assertTrue("".isEmpty()); + assertFalse(" ".isEmpty()); + assertFalse("\t\n\r\f".isEmpty()); + } + + @Test + public void givenString_whenCallStringIsBlank_thenReturnCorrectValues() { + assertFalse("Example text".isBlank()); + assertTrue("".isBlank()); + assertTrue(" ".isBlank()); + assertTrue("\t\n\r\f ".isBlank()); + } +} From fdd20e25a70188403eaed068ca8008d1c0091b5c Mon Sep 17 00:00:00 2001 From: timis1 Date: Tue, 21 Nov 2023 22:32:44 +0200 Subject: [PATCH 609/831] JAVA-26721 Upgrade okhttp, mockwebserver to latest version --- spring-5-webflux-2/pom.xml | 1 + spring-5-webflux/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-5-webflux-2/pom.xml b/spring-5-webflux-2/pom.xml index 34cbda6c18..efb99e06d5 100644 --- a/spring-5-webflux-2/pom.xml +++ b/spring-5-webflux-2/pom.xml @@ -86,6 +86,7 @@ com.squareup.okhttp3 mockwebserver + 4.12.0 diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml index 69de83c227..fe6dbe5292 100644 --- a/spring-5-webflux/pom.xml +++ b/spring-5-webflux/pom.xml @@ -74,6 +74,7 @@ com.squareup.okhttp3 mockwebserver + 4.12.0 From 1379b2dd94d28d646529603050ec8e2026b982c6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:50:28 +0100 Subject: [PATCH 610/831] JAVA-26765: Update persistence-modules/hibernate-jpa to new mysql connector --- persistence-modules/hibernate-jpa/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 5a99c1c4d0..603c749e95 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -56,8 +56,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -83,7 +83,7 @@ - 8.0.32 + 8.2.0 2.6.0 3.0.4 2.1.214 From e33de9ef00a5fa3afb796febb0130fa3ae70265e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:53:11 +0100 Subject: [PATCH 611/831] JAVA-26765: Update persistence-modules/hibernate-libraries to new mysql connector --- persistence-modules/hibernate-libraries/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml index 3f4da28296..15292689eb 100644 --- a/persistence-modules/hibernate-libraries/pom.xml +++ b/persistence-modules/hibernate-libraries/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 hibernate-libraries 0.0.1-SNAPSHOT @@ -63,8 +63,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} runtime @@ -168,7 +168,7 @@ 2.0.0 3.8.1 3.8.1 - 8.0.19 + 8.2.0 2.1.3.RELEASE From 30bca1ce27a417c145155e3d15037e6b8577fb21 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 21:54:42 +0100 Subject: [PATCH 612/831] JAVA-26765: Update persistence-modules/activejdbc to new mysql connector --- persistence-modules/activejdbc/pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml index a661fc3abb..602235b892 100644 --- a/persistence-modules/activejdbc/pom.xml +++ b/persistence-modules/activejdbc/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 activejdbc 1.0-SNAPSHOT @@ -28,8 +28,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} @@ -64,8 +64,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} @@ -76,7 +76,7 @@ 3.4-j11 development.test,development - 8.0.32 + 8.2.0 \ No newline at end of file From 6d43ac0b9d619c78e9805a2f8bf2311ec293eda6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:00:26 +0100 Subject: [PATCH 613/831] JAVA-26765: Update persistence-modules/spring-data-jpa-repo to new mysql connector --- persistence-modules/spring-data-jpa-repo/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml index 26fff365a1..debf9690f6 100644 --- a/persistence-modules/spring-data-jpa-repo/pom.xml +++ b/persistence-modules/spring-data-jpa-repo/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-jpa-repo spring-data-jpa-repo @@ -27,8 +27,8 @@ spring-boot-starter-data-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j org.postgresql From 97623cf4c612a9af4c221667dc6dae5b766c52ec Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:02:14 +0100 Subject: [PATCH 614/831] JAVA-26765: Update persistence-modules/spring-data-shardingsphere to new mysql connector --- persistence-modules/spring-data-shardingsphere/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-data-shardingsphere/pom.xml b/persistence-modules/spring-data-shardingsphere/pom.xml index c1ca313038..117a3ae7fe 100644 --- a/persistence-modules/spring-data-shardingsphere/pom.xml +++ b/persistence-modules/spring-data-shardingsphere/pom.xml @@ -17,7 +17,7 @@ 5.3.2 - 8.0.33 + 8.2.0 @@ -43,8 +43,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} From ff96e6a70a25933b4b7d8fccc76fbe61e5dca042 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:09:19 +0100 Subject: [PATCH 615/831] JAVA-26765: Update persistence-modules/spring-data-rest-querydsl to new mysql connector --- persistence-modules/spring-data-rest-querydsl/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml index dc1cf64006..89db7d24a5 100644 --- a/persistence-modules/spring-data-rest-querydsl/pom.xml +++ b/persistence-modules/spring-data-rest-querydsl/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 spring-data-rest-querydsl 1.0 @@ -28,8 +28,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j com.querydsl From 8a98a730c65b86d0972a5701391558fe7e62c6e1 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:14:39 +0100 Subject: [PATCH 616/831] JAVA-26765: Update persistence-modules/spring-jdbc to new mysql connector --- persistence-modules/spring-jdbc/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml index 08e43e8292..1aa9f4f851 100644 --- a/persistence-modules/spring-jdbc/pom.xml +++ b/persistence-modules/spring-jdbc/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-jdbc spring-jdbc @@ -27,8 +27,8 @@ h2 - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From d250fb85147724fa41ba1a28dbd4f28ba6ce6b09 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:16:34 +0100 Subject: [PATCH 617/831] JAVA-26765: Update persistence-modules/spring-data-jpa-query-2 to new mysql connector --- persistence-modules/spring-data-jpa-query-2/pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml index 1282d1d8a0..62bf7f0314 100644 --- a/persistence-modules/spring-data-jpa-query-2/pom.xml +++ b/persistence-modules/spring-data-jpa-query-2/pom.xml @@ -36,9 +36,9 @@ ${jta.version} - mysql - mysql-connector-java - 3.1.12 + com.mysql + mysql-connector-j + ${mysql.version} com.google.guava @@ -85,6 +85,7 @@ 9.0.0.M26 1.1 + 8.2.0 \ No newline at end of file From d3426ed5a310d20c928e12bd59b1578054d4b147 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:19:54 +0100 Subject: [PATCH 618/831] JAVA-26765: Update persistence-modules/spring-enterprise to new mysql connector --- persistence-modules/hibernate-enterprise/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml index 954f8f40d3..caf7b37a41 100644 --- a/persistence-modules/hibernate-enterprise/pom.xml +++ b/persistence-modules/hibernate-enterprise/pom.xml @@ -35,8 +35,8 @@ ${geodb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -79,7 +79,7 @@ 6.1.7.Final - 8.0.32 + 8.2.0 2.6.0 0.9 From e78f30f89299e26f15e86eecdaaab3af58c0c961 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:22:49 +0100 Subject: [PATCH 619/831] JAVA-26765: Update persistence-modules/spring-boot-persistence to new mysql connector --- persistence-modules/spring-boot-persistence/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 3c77386ddd..123e21ce59 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -47,8 +47,8 @@ tomcat-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -72,7 +72,7 @@ 2.23.0 2.0.1.Final - 8.0.31 + 8.2.0 com.baeldung.boot.Application From 5f9c8b078b3545ee9862b768fd353bd51e58a847 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Tue, 21 Nov 2023 22:24:44 +0100 Subject: [PATCH 620/831] JAVA-26765: Update persistence-modules/spring-hibernate-6 to new mysql connector --- persistence-modules/spring-hibernate-6/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/spring-hibernate-6/pom.xml b/persistence-modules/spring-hibernate-6/pom.xml index a13117e68c..f3ea82dfad 100644 --- a/persistence-modules/spring-hibernate-6/pom.xml +++ b/persistence-modules/spring-hibernate-6/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-hibernate-6 0.1-SNAPSHOT @@ -84,8 +84,8 @@ ${hsqldb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -102,7 +102,7 @@ 6.1.3 6.2.8.Final - 8.0.7-dmr + 8.2.0 9.0.80 From 76d261295986b4e31be99156f97d9b7039f4ac53 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 22 Nov 2023 04:38:37 +0100 Subject: [PATCH 621/831] [if-class-is-enum] check class is enum (#15235) * [if-class-is-enum] check class is enum * [if-class-is-enum] move to new module --- .../classcheck/CheckClassIsEnumUnitTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/classcheck/CheckClassIsEnumUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/classcheck/CheckClassIsEnumUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/classcheck/CheckClassIsEnumUnitTest.java new file mode 100644 index 0000000000..a69df8739f --- /dev/null +++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/classcheck/CheckClassIsEnumUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.enums.classcheck; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +enum Device { + Keyboard, Monitor, Mouse, Printer +} + +enum Weekday { + Monday, Tuesday, Wednesday, Thursday, Friday, + Saturday { + @Override + boolean isWeekend() { + return true; + } + }, + Sunday { + @Override + boolean isWeekend() { + return true; + } + }; + + boolean isWeekend() { + return false; + } +} + +public class CheckClassIsEnumUnitTest { + + @Test + void whenUsingInstanceOf_thenGetExpectedResult() { + Object obj = Device.Keyboard; + assertTrue(obj instanceof Enum); + } + + @Test + void whenUsingisInstance_thenGetExpectedResult() { + Object obj = Device.Keyboard; + assertTrue(Enum.class.isInstance(obj)); + } + + @Test + void whenUsingEnumClassisAssignableFrom_thenGetExpectedResult() { + Object obj = Device.Keyboard; + assertTrue(Enum.class.isAssignableFrom(obj.getClass())); + } + + @Test + void whenUsingGetClassIsEnum_thenGetExpectedResult() { + assertTrue(Device.class.isEnum()); + + Object obj = Device.Keyboard; + assertTrue(obj.getClass().isEnum()); + } + + + @Test + void whenEnum_thenGetExpectedResult() { + Object monday = Weekday.Monday; + assertTrue(monday instanceof Enum); + assertTrue(Enum.class.isInstance(monday)); + assertTrue(Enum.class.isAssignableFrom(monday.getClass())); + assertTrue(monday.getClass().isEnum()); + + Object sunday = Weekday.Sunday; + assertTrue(sunday instanceof Enum); + assertTrue(Enum.class.isInstance(sunday)); + assertTrue(Enum.class.isAssignableFrom(sunday.getClass())); + assertFalse(sunday.getClass().isEnum()); // <-- isEnum() check failed when Enum values with body + } +} \ No newline at end of file From b64a40f6f4f11c517c95dcdde684d3dec55a0f44 Mon Sep 17 00:00:00 2001 From: macasari Date: Wed, 22 Nov 2023 10:40:38 +0100 Subject: [PATCH 622/831] BAEL-6600 - fix various reported issues --- .../baeldung/map/HashMapWithMaxSizeLimit.java | 3 --- ...itMaxSizeHashMapByLinkedHashMapUnitTest.java | 17 ++++++----------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java index 517dac6362..63736e49f3 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -3,9 +3,6 @@ package com.baeldung.map; import java.util.HashMap; public class HashMapWithMaxSizeLimit extends HashMap { - - private static final long serialVersionUID = 1L; - private int maxSize = -1; public HashMapWithMaxSizeLimit() { diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java index 0986f426d9..d32d98da3a 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java @@ -5,19 +5,18 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import java.util.LinkedHashMap; import java.util.Map; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class LimitMaxSizeHashMapByLinkedHashMapUnitTest { - private final int MAX_SIZE = 4; - private LinkedHashMap linkedHashMap; - - @BeforeEach - void setUp() { + @Test + void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { + final int MAX_SIZE = 4; + LinkedHashMap linkedHashMap; linkedHashMap = new LinkedHashMap() { private static final long serialVersionUID = 1L; - + + @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_SIZE; } @@ -26,10 +25,6 @@ class LimitMaxSizeHashMapByLinkedHashMapUnitTest { linkedHashMap.put(2, "Two"); linkedHashMap.put(3, "Three"); linkedHashMap.put(4, "Four"); - } - - @Test - void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { linkedHashMap.put(5, "Five"); String[] expectedArrayAfterFive = { "Two", "Three", "Four", "Five" }; assertArrayEquals(expectedArrayAfterFive, linkedHashMap.values() From da0df4cf8a448033eab1236211842b0bdaa63d05 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:09:43 +0000 Subject: [PATCH 623/831] [JAVA-26374-spring-data-jpa-enterprise] Moved articles from spring-data-jpa-enterprise-2 to spring-data-jpa-enterprise (#15103) --- .../spring-data-jpa-enterprise-2/README.md | 3 +-- .../spring-data-jpa-enterprise/README.md | 2 ++ .../baeldung/multipledb/MultipleDbApplication.java | 0 .../PersistenceProductAutoConfiguration.java | 0 .../PersistenceProductConfiguration.java | 8 +++++--- .../PersistenceUserAutoConfiguration.java | 0 .../multipledb/PersistenceUserConfiguration.java | 14 ++++++++++---- .../multipledb/dao/product/ProductRepository.java | 0 .../multipledb/dao/user/PossessionRepository.java | 0 .../multipledb/dao/user/UserRepository.java | 0 .../baeldung/multipledb/model/product/Product.java | 0 .../baeldung/multipledb/model/user/Possession.java | 6 +++++- .../com/baeldung/multipledb/model/user/User.java | 10 ++++++++-- .../persistence-multiple-db-boot.properties | 0 .../resources/persistence-multiple-db.properties | 0 .../multipledb/JpaMultipleDBIntegrationTest.java | 0 .../ProductRepositoryIntegrationTest.java | 0 17 files changed, 31 insertions(+), 12 deletions(-) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/PersistenceProductAutoConfiguration.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java (99%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/PersistenceUserAutoConfiguration.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java (90%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/dao/user/PossessionRepository.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/dao/user/UserRepository.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/model/product/Product.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/model/user/Possession.java (90%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/java/com/baeldung/multipledb/model/user/User.java (87%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/resources/persistence-multiple-db-boot.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/main/resources/persistence-multiple-db.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/test/java/com/baeldung/multipledb/JpaMultipleDBIntegrationTest.java (100%) rename persistence-modules/{spring-data-jpa-enterprise-2 => spring-data-jpa-enterprise}/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java (100%) diff --git a/persistence-modules/spring-data-jpa-enterprise-2/README.md b/persistence-modules/spring-data-jpa-enterprise-2/README.md index 9bb08cc497..8e154f6b75 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/README.md +++ b/persistence-modules/spring-data-jpa-enterprise-2/README.md @@ -4,8 +4,7 @@ This module contains articles about Spring Data JPA used in enterprise applicati ### Relevant Articles: -- [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases) -- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting) + ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md index d1039dcc50..b563fa46d4 100644 --- a/persistence-modules/spring-data-jpa-enterprise/README.md +++ b/persistence-modules/spring-data-jpa-enterprise/README.md @@ -11,6 +11,8 @@ This module contains articles about Spring Data JPA used in enterprise applicati - [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) - [Partial Data Update With Spring Data](https://www.baeldung.com/spring-data-partial-update) - [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation) +- [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases) +- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceProductAutoConfiguration.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceProductAutoConfiguration.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceProductAutoConfiguration.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceProductAutoConfiguration.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java index bcf2cd84eb..da974e979a 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java @@ -1,6 +1,9 @@ package com.baeldung.multipledb; -import com.google.common.base.Preconditions; +import java.util.HashMap; + +import javax.sql.DataSource; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,8 +17,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import javax.sql.DataSource; -import java.util.HashMap; +import com.google.common.base.Preconditions; @Configuration @PropertySource({"classpath:persistence-multiple-db.properties"}) diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceUserAutoConfiguration.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceUserAutoConfiguration.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceUserAutoConfiguration.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceUserAutoConfiguration.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java similarity index 90% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java index 6b48455c0c..ca5d6f9c7a 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/PersistenceUserConfiguration.java @@ -1,8 +1,15 @@ package com.baeldung.multipledb; -import com.google.common.base.Preconditions; +import java.util.HashMap; + +import javax.sql.DataSource; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; +import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -11,8 +18,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; -import javax.sql.DataSource; -import java.util.HashMap; +import com.google.common.base.Preconditions; @Configuration @PropertySource({"classpath:persistence-multiple-db.properties"}) diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/user/PossessionRepository.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/user/PossessionRepository.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/user/PossessionRepository.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/user/PossessionRepository.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/user/UserRepository.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/user/UserRepository.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/dao/user/UserRepository.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/dao/user/UserRepository.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/product/Product.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/product/Product.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/product/Product.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/product/Product.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/Possession.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/Possession.java similarity index 90% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/Possession.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/Possession.java index af646ffd04..c9bd3c42bc 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/Possession.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/Possession.java @@ -1,6 +1,10 @@ package com.baeldung.multipledb.model.user; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; @Entity @Table diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/User.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/User.java similarity index 87% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/User.java rename to persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/User.java index 1985c543d3..224eefc3ff 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/multipledb/model/user/User.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/multipledb/model/user/User.java @@ -1,9 +1,15 @@ package com.baeldung.multipledb.model.user; -import javax.persistence.*; - import java.util.List; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + @Entity @Table(name = "users") public class User { diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/resources/persistence-multiple-db-boot.properties b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/persistence-multiple-db-boot.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/resources/persistence-multiple-db-boot.properties rename to persistence-modules/spring-data-jpa-enterprise/src/main/resources/persistence-multiple-db-boot.properties diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-data-jpa-enterprise/src/main/resources/persistence-multiple-db.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/main/resources/persistence-multiple-db.properties rename to persistence-modules/spring-data-jpa-enterprise/src/main/resources/persistence-multiple-db.properties diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/multipledb/JpaMultipleDBIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/multipledb/JpaMultipleDBIntegrationTest.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/multipledb/JpaMultipleDBIntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/multipledb/JpaMultipleDBIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java From aff7d722b1c274ea7eef23267cd3b49d3b8c0942 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:15:20 +0000 Subject: [PATCH 624/831] [JAVA-26374-spring-mvc-java] Moved popular articles to spring-mvc-java (#15097) * [JAVA-26374-spring-mvc-java] Moved "Spring @PathVariable Annotation" article to spring-mvc-java * [JAVA-26374-spring-mvc-java] Moved "Working with Date Parameters in Spring" article to spring-mvc-java --- spring-web-modules/spring-mvc-java-2/README.md | 2 -- spring-web-modules/spring-mvc-java/README.md | 3 +++ .../src/main/java/com/baeldung/datetime/DateTimeConfig.java | 0 .../main/java/com/baeldung/datetime/DateTimeController.java | 0 .../pathvariable/PathVariableAnnotationController.java | 0 5 files changed, 3 insertions(+), 2 deletions(-) rename spring-web-modules/{spring-mvc-java-2 => spring-mvc-java}/src/main/java/com/baeldung/datetime/DateTimeConfig.java (100%) rename spring-web-modules/{spring-mvc-java-2 => spring-mvc-java}/src/main/java/com/baeldung/datetime/DateTimeController.java (100%) rename spring-web-modules/{spring-mvc-java-2 => spring-mvc-java}/src/main/java/com/baeldung/pathvariable/PathVariableAnnotationController.java (100%) diff --git a/spring-web-modules/spring-mvc-java-2/README.md b/spring-web-modules/spring-mvc-java-2/README.md index 74d8cca312..1f8231bada 100644 --- a/spring-web-modules/spring-mvc-java-2/README.md +++ b/spring-web-modules/spring-mvc-java-2/README.md @@ -1,9 +1,7 @@ ### Relevant Articles: - [Cache Headers in Spring MVC](https://www.baeldung.com/spring-mvc-cache-headers) -- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters) - [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot) - [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables) - [Converting a Spring MultipartFile to a File](https://www.baeldung.com/spring-multipartfile-to-file) - [Testing a Spring Multipart POST Request](https://www.baeldung.com/spring-multipart-post-request-test) -- [Spring @PathVariable Annotation](https://www.baeldung.com/spring-pathvariable) diff --git a/spring-web-modules/spring-mvc-java/README.md b/spring-web-modules/spring-mvc-java/README.md index afd1aea3bf..656e415f6a 100644 --- a/spring-web-modules/spring-mvc-java/README.md +++ b/spring-web-modules/spring-mvc-java/README.md @@ -14,3 +14,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js) +- [Spring @PathVariable Annotation](https://www.baeldung.com/spring-pathvariable) +- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters) + diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java similarity index 100% rename from spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeConfig.java rename to spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java similarity index 100% rename from spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/datetime/DateTimeController.java rename to spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/PathVariableAnnotationController.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/pathvariable/PathVariableAnnotationController.java similarity index 100% rename from spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/pathvariable/PathVariableAnnotationController.java rename to spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/pathvariable/PathVariableAnnotationController.java From c23f0d6b1fe031f2b6477befb60c45536c3fe5ad Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:28:23 +0000 Subject: [PATCH 625/831] =?UTF-8?q?[JAVA-26374-spring-resttemplate]=20Move?= =?UTF-8?q?d=20"RestTemplate=20Post=20Request=20wit=E2=80=A6=20(#15104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-26374-spring-resttemplate] Moved "RestTemplate Post Request with JSON" to spring-resttemplate-1 * [JAVA-26374] Moved "Get and Post Lists of Objects with RestTemplate" article to spring-resttemplate-1 --- spring-web-modules/pom.xml | 1 + .../spring-resttemplate-1/README.md | 7 +++++ .../spring-resttemplate-1/pom.xml | 30 +++++++++++++++++++ .../resttemplate/RestTemplateApplication.java | 0 .../RestTemplateConfigurationApplication.java | 0 .../lists/EmployeeApplication.java | 0 .../lists/client/EmployeeClient.java | 13 ++++---- .../lists/controller/EmployeeResource.java | 4 +-- .../resttemplate/lists/dto/Employee.java | 0 .../resttemplate/lists/dto/EmployeeList.java | 0 .../lists/service/EmployeeService.java | 6 ++-- .../web/controller/PersonAPI.java | 0 .../baeldung/resttemplate/web/dto/Person.java | 0 .../web/service/PersonService.java | 0 .../web/service/PersonServiceImpl.java | 0 .../src/main/resources/application.properties | 2 ++ .../postjson/PersonAPILiveTest.java | 0 ...stTemplatePostRequestEncodingLiveTest.java | 0 .../src/test/resources/application.properties | 5 ++++ .../src/test/resources/logback-test.xml | 12 ++++++++ .../spring-resttemplate-2/README.md | 1 - .../spring-resttemplate-3/README.md | 1 - 22 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 spring-web-modules/spring-resttemplate-1/README.md create mode 100644 spring-web-modules/spring-resttemplate-1/pom.xml rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java (100%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java (100%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java (99%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java (100%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java (100%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java (100%) rename spring-web-modules/{spring-resttemplate-3 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/web/dto/Person.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java (100%) create mode 100644 spring-web-modules/spring-resttemplate-1/src/main/resources/application.properties rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java (100%) rename spring-web-modules/{spring-resttemplate-2 => spring-resttemplate-1}/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java (100%) create mode 100644 spring-web-modules/spring-resttemplate-1/src/test/resources/application.properties create mode 100644 spring-web-modules/spring-resttemplate-1/src/test/resources/logback-test.xml diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 2be896ad83..87bcfaa203 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -44,6 +44,7 @@ spring-rest-simple spring-rest-testing spring-resttemplate + spring-resttemplate-1 spring-resttemplate-2 spring-resttemplate-3 spring-session diff --git a/spring-web-modules/spring-resttemplate-1/README.md b/spring-web-modules/spring-resttemplate-1/README.md new file mode 100644 index 0000000000..d5cf69e86a --- /dev/null +++ b/spring-web-modules/spring-resttemplate-1/README.md @@ -0,0 +1,7 @@ +## Spring RestTemplate + +This module contains articles about Spring RestTemplate + +### Relevant Articles: +- [RestTemplate Post Request with JSON](https://www.baeldung.com/spring-resttemplate-post-json) +- [Get and Post Lists of Objects with RestTemplate](https://www.baeldung.com/spring-rest-template-list) diff --git a/spring-web-modules/spring-resttemplate-1/pom.xml b/spring-web-modules/spring-resttemplate-1/pom.xml new file mode 100644 index 0000000000..209c941ede --- /dev/null +++ b/spring-web-modules/spring-resttemplate-1/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + spring-resttemplate-1 + 0.1-SNAPSHOT + spring-resttemplate-1 + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/RestTemplateApplication.java diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/RestTemplateConfigurationApplication.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java similarity index 100% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java similarity index 99% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java index 49e375f9cc..7fa0d55690 100644 --- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java +++ b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java @@ -1,16 +1,17 @@ package com.baeldung.resttemplate.lists.client; -import com.baeldung.resttemplate.lists.dto.Employee; -import com.baeldung.resttemplate.lists.dto.EmployeeList; +import static java.util.Arrays.asList; + +import java.util.ArrayList; +import java.util.List; + import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; -import java.util.List; - -import static java.util.Arrays.asList; +import com.baeldung.resttemplate.lists.dto.Employee; +import com.baeldung.resttemplate.lists.dto.EmployeeList; /** * Application that shows how to use Lists with RestTemplate. diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java similarity index 100% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java index 8a4d510f63..1cd68f89b9 100644 --- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java +++ b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java @@ -1,5 +1,7 @@ package com.baeldung.resttemplate.lists.controller; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,8 +12,6 @@ import com.baeldung.resttemplate.lists.dto.Employee; import com.baeldung.resttemplate.lists.dto.EmployeeList; import com.baeldung.resttemplate.lists.service.EmployeeService; -import java.util.List; - @RestController @RequestMapping("/employees") public class EmployeeResource diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java similarity index 100% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java similarity index 100% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java diff --git a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java similarity index 100% rename from spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java index 8a1773483a..a9ea3f373f 100644 --- a/spring-web-modules/spring-resttemplate-3/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java +++ b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java @@ -1,12 +1,12 @@ package com.baeldung.resttemplate.lists.service; +import java.util.ArrayList; +import java.util.List; + import org.springframework.stereotype.Service; import com.baeldung.resttemplate.lists.dto.Employee; -import java.util.ArrayList; -import java.util.List; - @Service("EmployeeListService") public class EmployeeService { diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/controller/PersonAPI.java diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/dto/Person.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/dto/Person.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/dto/Person.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/dto/Person.java diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/service/PersonService.java diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java b/spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java rename to spring-web-modules/spring-resttemplate-1/src/main/java/com/baeldung/resttemplate/web/service/PersonServiceImpl.java diff --git a/spring-web-modules/spring-resttemplate-1/src/main/resources/application.properties b/spring-web-modules/spring-resttemplate-1/src/main/resources/application.properties new file mode 100644 index 0000000000..ea4f7c866d --- /dev/null +++ b/spring-web-modules/spring-resttemplate-1/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=8080 +server.servlet.context-path=/spring-rest \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java b/spring-web-modules/spring-resttemplate-1/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java rename to spring-web-modules/spring-resttemplate-1/src/test/java/com/baeldung/resttemplate/postjson/PersonAPILiveTest.java diff --git a/spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java b/spring-web-modules/spring-resttemplate-1/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java similarity index 100% rename from spring-web-modules/spring-resttemplate-2/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java rename to spring-web-modules/spring-resttemplate-1/src/test/java/com/baeldung/resttemplate/postjson/RestTemplatePostRequestEncodingLiveTest.java diff --git a/spring-web-modules/spring-resttemplate-1/src/test/resources/application.properties b/spring-web-modules/spring-resttemplate-1/src/test/resources/application.properties new file mode 100644 index 0000000000..286ea95a4f --- /dev/null +++ b/spring-web-modules/spring-resttemplate-1/src/test/resources/application.properties @@ -0,0 +1,5 @@ +logging.level.org.springframework.web.client.RestTemplate=DEBUG +logging.level.com.baeldung.resttemplate.logging=DEBUG +logging.level.org.apache.http=DEBUG +logging.level.httpclient.wire=DEBUG +logging.pattern.console=%20logger{20} - %msg%n diff --git a/spring-web-modules/spring-resttemplate-1/src/test/resources/logback-test.xml b/spring-web-modules/spring-resttemplate-1/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/spring-web-modules/spring-resttemplate-1/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file diff --git a/spring-web-modules/spring-resttemplate-2/README.md b/spring-web-modules/spring-resttemplate-2/README.md index ace7ae817b..ad2a671040 100644 --- a/spring-web-modules/spring-resttemplate-2/README.md +++ b/spring-web-modules/spring-resttemplate-2/README.md @@ -7,7 +7,6 @@ This module contains articles about Spring RestTemplate - [Spring RestTemplate Request/Response Logging](https://www.baeldung.com/spring-resttemplate-logging) - [Proxies With RestTemplate](https://www.baeldung.com/java-resttemplate-proxy) - [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) -- [RestTemplate Post Request with JSON](https://www.baeldung.com/spring-resttemplate-post-json) - [How to Compress Requests Using the Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-compressing-requests) - [Get list of JSON objects with Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-json-list) - [Spring RestTemplate Exception: “Not enough variables available to expand”](https://www.baeldung.com/spring-not-enough-variables-available) diff --git a/spring-web-modules/spring-resttemplate-3/README.md b/spring-web-modules/spring-resttemplate-3/README.md index f3cfb1d671..14aaf77b9e 100644 --- a/spring-web-modules/spring-resttemplate-3/README.md +++ b/spring-web-modules/spring-resttemplate-3/README.md @@ -7,7 +7,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Uploading MultipartFile with Spring RestTemplate](https://www.baeldung.com/spring-rest-template-multipart-upload) -- [Get and Post Lists of Objects with RestTemplate](https://www.baeldung.com/spring-rest-template-list) - [Download a Large File Through a Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-download-large-file) - [Access HTTPS REST Service Using Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-secure-https-service) - [Encoding of URI Variables on RestTemplate](https://www.baeldung.com/spring-resttemplate-uri-variables-encode) From 760481ec043930638a7779652026821cb75d20c9 Mon Sep 17 00:00:00 2001 From: gaepi Date: Wed, 22 Nov 2023 15:41:49 +0100 Subject: [PATCH 626/831] JAVA-27657 | Replacing deprecated WebSecurityConfigurerAdapter --- .../HttpSecurityConfig.java | 10 +++-- .../WebSecurityConfig.java | 43 ++++++++++++------- .../oauth2resttemplate/SecurityConfig.java | 1 - .../saml/config/WebSecurityConfig.java | 36 ++++++---------- .../com/baeldung/spring/SecurityConfig.java | 3 +- 5 files changed, 48 insertions(+), 45 deletions(-) diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java index d6361255e5..414f782907 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/HttpSecurityConfig.java @@ -1,16 +1,17 @@ package com.baeldung.httpsecurityvswebsecurity; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity -public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { +public class HttpSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // Given: HttpSecurity configured http.authorizeRequests() @@ -27,5 +28,6 @@ public class HttpSecurityConfig extends WebSecurityConfigurerAdapter { // When: Accessing specific URLs // Then: Access is granted based on defined rules + return http.build(); } } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 46a82918aa..ec50069ba5 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -1,35 +1,48 @@ package com.baeldung.httpsecurityvswebsecurity; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig { @Autowired private UserDetailsService userDetailsService; - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .userDetailsService(userDetailsService) - .passwordEncoder(new BCryptPasswordEncoder()); + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + + AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); + authenticationManagerBuilder.userDetailsService(userDetailsService); + AuthenticationManager authenticationManager = authenticationManagerBuilder.build(); + http.authorizeRequests() - .antMatchers("/") - .permitAll() - .anyRequest() - .authenticated() - .and() - .formLogin(); + .antMatchers("/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin().and() + .authenticationManager(authenticationManager) + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + return http.build(); + } + + protected void configure(HttpSecurity http) throws Exception { + } } diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java index 1fb9a6773a..3a8e037f72 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java @@ -8,7 +8,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.oauth2.client.OAuth2ClientContext; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter; diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java index 297c391823..956233dfaf 100644 --- a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java @@ -10,11 +10,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.saml.*; import org.springframework.security.saml.key.KeyManager; import org.springframework.security.saml.metadata.*; @@ -31,7 +29,7 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true) -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig { @Value("${saml.sp}") private String samlAudience; @@ -55,8 +53,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public SAMLDiscovery samlDiscovery() { - SAMLDiscovery idpDiscovery = new SAMLDiscovery(); - return idpDiscovery; + return new SAMLDiscovery(); } @Autowired @@ -78,19 +75,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { } @Bean - public SAMLProcessingFilter samlWebSSOProcessingFilter() throws Exception { + public SAMLProcessingFilter samlWebSSOProcessingFilter(AuthenticationManager authenticationManager) { SAMLProcessingFilter samlWebSSOProcessingFilter = new SAMLProcessingFilter(); - samlWebSSOProcessingFilter.setAuthenticationManager(authenticationManager()); + samlWebSSOProcessingFilter.setAuthenticationManager(authenticationManager); samlWebSSOProcessingFilter.setAuthenticationSuccessHandler(samlAuthSuccessHandler); samlWebSSOProcessingFilter.setAuthenticationFailureHandler(samlAuthFailureHandler); return samlWebSSOProcessingFilter; } @Bean - public FilterChainProxy samlFilter() throws Exception { + public FilterChainProxy samlFilter(SAMLProcessingFilter samlProcessingFilter) throws Exception { List chains = new ArrayList<>(); chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"), - samlWebSSOProcessingFilter())); + samlProcessingFilter)); chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"), samlDiscovery())); chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"), @@ -102,19 +99,13 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { return new FilterChainProxy(chains); } - @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); - } - @Bean public MetadataGeneratorFilter metadataGeneratorFilter() { return new MetadataGeneratorFilter(metadataGenerator()); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http, SAMLProcessingFilter samlProcessingFilter) throws Exception { http .csrf() .disable(); @@ -125,8 +116,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { http .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class) - .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class) - .addFilterBefore(samlFilter(), CsrfFilter.class); + .addFilterAfter(samlProcessingFilter, BasicAuthenticationFilter.class) + .addFilterBefore(samlProcessingFilter, CsrfFilter.class); http .authorizeRequests() @@ -142,11 +133,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { e.printStackTrace(); } }); - } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(samlAuthenticationProvider); + http.authenticationProvider(samlAuthenticationProvider); + + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-persistent-login/src/main/java/com/baeldung/spring/SecurityConfig.java b/spring-security-modules/spring-security-web-persistent-login/src/main/java/com/baeldung/spring/SecurityConfig.java index d3cfff81cb..0a9c717f5a 100644 --- a/spring-security-modules/spring-security-web-persistent-login/src/main/java/com/baeldung/spring/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-persistent-login/src/main/java/com/baeldung/spring/SecurityConfig.java @@ -3,7 +3,6 @@ package com.baeldung.spring; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * Spring Security Configuration. @@ -11,7 +10,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur @Configuration @EnableWebSecurity @ImportResource({ "classpath:webSecurityConfig.xml" }) -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { public SecurityConfig() { super(); From 1f5f4af22ab4f72e00c6bde52946cda4687982cf Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Tue, 21 Nov 2023 14:09:04 +0100 Subject: [PATCH 627/831] GST-4 Timefold Solver --- pom.xml | 2 + timefold-solver/README.md | 7 +++ timefold-solver/pom.xml | 44 ++++++++++++++ .../com/baeldung/timefoldsolver/Employee.java | 32 +++++++++++ .../com/baeldung/timefoldsolver/Shift.java | 57 +++++++++++++++++++ .../timefoldsolver/ShiftSchedule.java | 47 +++++++++++++++ .../timefoldsolver/ShiftScheduleApp.java | 54 ++++++++++++++++++ .../ShiftScheduleConstraintProvider.java | 37 ++++++++++++ .../ShiftScheduleConstraintProviderTest.java | 50 ++++++++++++++++ 9 files changed, 330 insertions(+) create mode 100644 timefold-solver/README.md create mode 100644 timefold-solver/pom.xml create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java create mode 100644 timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java create mode 100644 timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java diff --git a/pom.xml b/pom.xml index 7099dd8cbc..8729aa8f5c 100644 --- a/pom.xml +++ b/pom.xml @@ -894,6 +894,7 @@ tensorflow-java testing-modules testing-modules/mockito-simple + timefold-solver vaadin vavr-modules vertx-modules @@ -1139,6 +1140,7 @@ tensorflow-java testing-modules testing-modules/mockito-simple + timefold-solver vaadin vavr-modules vertx-modules diff --git a/timefold-solver/README.md b/timefold-solver/README.md new file mode 100644 index 0000000000..b7a2dbe14b --- /dev/null +++ b/timefold-solver/README.md @@ -0,0 +1,7 @@ +## OptaPlanner + +This module contains articles about OptaPlanner. + +### Relevant articles + +- [A Guide to OptaPlanner](https://www.baeldung.com/opta-planner) diff --git a/timefold-solver/pom.xml b/timefold-solver/pom.xml new file mode 100644 index 0000000000..2a219a593c --- /dev/null +++ b/timefold-solver/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + timefold-solver + timefold-solver + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + ai.timefold.solver + timefold-solver-bom + ${version.ai.timefold.solver} + pom + import + + + + + + ai.timefold.solver + timefold-solver-core + + + ai.timefold.solver + timefold-solver-test + test + + + + + 17 + 17 + 1.4.0 + + + diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java new file mode 100644 index 0000000000..c755896201 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java @@ -0,0 +1,32 @@ +package com.baeldung.timefoldsolver; + +import java.util.Set; + +public class Employee { + + private String name; + private Set skills; + + public Employee(String name, Set skills) { + this.name = name; + this.skills = skills; + } + + @Override + public String toString() { + return name; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public String getName() { + return name; + } + + public Set getSkills() { + return skills; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java new file mode 100644 index 0000000000..04087134c6 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -0,0 +1,57 @@ +package com.baeldung.timefoldsolver; + +import java.time.LocalDateTime; + +import ai.timefold.solver.core.api.domain.entity.PlanningEntity; +import ai.timefold.solver.core.api.domain.variable.PlanningVariable; + +@PlanningEntity +public class Shift { + + private LocalDateTime start; + private LocalDateTime end; + private String requiredSkill; + + @PlanningVariable + private Employee employee; + + // A no-arg constructor is required for @PlanningEntity annotated classes + public Shift() {} + + public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill) { + this(start, end, requiredSkill, null); + } + + public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill, Employee employee) { + this.start = start; + this.end = end; + this.requiredSkill = requiredSkill; + this.employee = employee; + } + + @Override + public String toString() { + return start + " - " + end; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public LocalDateTime getStart() { + return start; + } + + public LocalDateTime getEnd() { + return end; + } + + public String getRequiredSkill() { + return requiredSkill; + } + + public Employee getEmployee() { + return employee; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java new file mode 100644 index 0000000000..85abc8eb66 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -0,0 +1,47 @@ +package com.baeldung.timefoldsolver; + +import java.util.List; + +import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty; +import ai.timefold.solver.core.api.domain.solution.PlanningScore; +import ai.timefold.solver.core.api.domain.solution.PlanningSolution; +import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider; +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; + +@PlanningSolution +public class ShiftSchedule { + + @ValueRangeProvider + private List employees; + @PlanningEntityCollectionProperty + private List shifts; + + @PlanningScore + private HardSoftScore score = null; + + // A no-arg constructor is required for @PlanningSolution annotated classes + public ShiftSchedule() { + } + + public ShiftSchedule(List employees, List shifts) { + this.employees = employees; + this.shifts = shifts; + } + + // ************************************************************************ + // Getters and setters + // ************************************************************************ + + public List getEmployees() { + return employees; + } + + public List getShifts() { + return shifts; + } + + public HardSoftScore getScore() { + return score; + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java new file mode 100644 index 0000000000..9c25922dea --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -0,0 +1,54 @@ +package com.baeldung.timefoldsolver; + +import java.time.Duration; +import java.time.LocalDate; +import java.util.List; +import java.util.Set; + +import ai.timefold.solver.core.api.solver.Solver; +import ai.timefold.solver.core.api.solver.SolverFactory; +import ai.timefold.solver.core.config.solver.SolverConfig; + +public class ShiftScheduleApp { + + public static void main(String[] args) { + SolverFactory solverFactory = SolverFactory.create(new SolverConfig() + .withSolutionClass(ShiftSchedule.class) + .withEntityClasses(Shift.class) + .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) + // The solver runs only for 5 seconds on this small dataset. + // It's recommended to run for at least 5 minutes ("5m") otherwise. + .withTerminationSpentLimit(Duration.ofSeconds(5))); + Solver solver = solverFactory.buildSolver(); + + ShiftSchedule problem = loadProblem(); + ShiftSchedule solution = solver.solve(problem); + printSolution(solution); + } + + private static ShiftSchedule loadProblem() { + LocalDate monday = LocalDate.of(2030, 4, 1); + LocalDate tuesday = LocalDate.of(2030, 4, 2); + return new ShiftSchedule(List.of( + new Employee("Ann", Set.of("Bartender")), + new Employee("Beth", Set.of("Waiter", "Bartender")), + new Employee("Carl", Set.of("Waiter")) + ), List.of( + new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), + new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), + new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), + new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), + new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender") + )); + } + + private static void printSolution(ShiftSchedule solution) { + System.out.println("Shift assignments"); + for (Shift shift : solution.getShifts()) { + System.out.println(" " + shift.getStart().toLocalDate() + + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() + + ": " + shift.getEmployee().getName()); + } + } + +} diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java new file mode 100644 index 0000000000..0846429460 --- /dev/null +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java @@ -0,0 +1,37 @@ +package com.baeldung.timefoldsolver; + +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; +import ai.timefold.solver.core.api.score.stream.Constraint; +import ai.timefold.solver.core.api.score.stream.ConstraintFactory; +import ai.timefold.solver.core.api.score.stream.ConstraintProvider; + +import static ai.timefold.solver.core.api.score.stream.Joiners.equal; + +public class ShiftScheduleConstraintProvider implements ConstraintProvider { + + @Override + public Constraint[] defineConstraints(ConstraintFactory constraintFactory) { + return new Constraint[] { + atMostOneShiftPerDay(constraintFactory), + requiredSkill(constraintFactory) + }; + } + + public Constraint atMostOneShiftPerDay(ConstraintFactory constraintFactory) { + return constraintFactory.forEach(Shift.class) + .join(Shift.class, + equal(shift -> shift.getStart().toLocalDate()), + equal(Shift::getEmployee)) + .filter((shift1, shift2) -> shift1 != shift2) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("At most one shift per day"); + } + + public Constraint requiredSkill(ConstraintFactory constraintFactory) { + return constraintFactory.forEach(Shift.class) + .filter(shift -> !shift.getEmployee().getSkills().contains(shift.getRequiredSkill())) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("Required skill"); + } + +} diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java new file mode 100644 index 0000000000..9979f5d5e0 --- /dev/null +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -0,0 +1,50 @@ +package com.baeldung.timefoldsolver; + +import java.time.LocalDate; +import java.util.Set; + +import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; +import org.junit.jupiter.api.Test; + +class ShiftScheduleConstraintProviderTest { + + private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); + private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); + + ConstraintVerifier constraintVerifier = ConstraintVerifier.build( + new ShiftScheduleConstraintProvider(), ShiftSchedule.class, Shift.class); + + @Test + void atMostOneShiftPerDay() { + Employee ann = new Employee("Ann", null); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), + new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) + // Penalizes both A-B and B-A. To avoid that, use forEachUniquePair() in the constraint instead. + .penalizesBy(2); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), + new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) + .penalizesBy(0); + } + + @Test + void requiredSkill() { + Employee ann = new Employee("Ann", Set.of("Waiter")); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) + .penalizesBy(1); + constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) + .given( + ann, + new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) + .penalizesBy(0); + } + +} From 7deec4a5e050c91e783669f0aebd6a0724f776fb Mon Sep 17 00:00:00 2001 From: Vladyslav Chernov Date: Wed, 22 Nov 2023 16:06:21 -0800 Subject: [PATCH 628/831] BAEL-5755: indention update --- .../baeldung/xml/xml2csv/Xml2CsvExample.java | 18 +++++++++--------- .../xml/xml2csv/Xml2CsvExampleUnitTest.java | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java index 99e5c7c0cb..84098b33f8 100644 --- a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java +++ b/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java @@ -40,7 +40,7 @@ public class Xml2CsvExample { protected static void convertXml2CsvXslt(String xslPath, String xmlPath, String csvPath) throws IOException, TransformerException { StreamSource styleSource = new StreamSource(new File(xslPath)); Transformer transformer = TransformerFactory.newInstance() - .newTransformer(styleSource); + .newTransformer(styleSource); Source source = new StreamSource(new File(xmlPath)); Result outputTarget = new StreamResult(new File(csvPath)); transformer.transform(source, outputTarget); @@ -68,26 +68,26 @@ public class Xml2CsvExample { if ("Bookstore".equals(currentElement)) { bookstoreInfo.setLength(0); bookstoreInfo.append(reader.getAttributeValue(null, "id")) - .append(","); + .append(","); } if ("Book".equals(currentElement)) { csvRow.append(bookstoreInfo) - .append(reader.getAttributeValue(null, "id")) - .append(",") - .append(reader.getAttributeValue(null, "category")) - .append(","); + .append(reader.getAttributeValue(null, "id")) + .append(",") + .append(reader.getAttributeValue(null, "category")) + .append(","); } if ("Author".equals(currentElement)) { csvRow.append(reader.getAttributeValue(null, "id")) - .append(","); + .append(","); } break; case XMLStreamConstants.CHARACTERS: if (!reader.isWhiteSpace()) { csvRow.append(reader.getText() - .trim()) - .append(","); + .trim()) + .append(","); } break; diff --git a/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java b/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java index 3fa44b427c..181d284b2d 100644 --- a/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java @@ -91,7 +91,7 @@ public class Xml2CsvExampleUnitTest { Xml2CsvExample.convertXml2CsvXslt(STYLE_XSL, DATA_XML, TEMP_OUTPUT_CSV); File csvFile = new File(TEMP_OUTPUT_CSV); - try(BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { + try (BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { String line; boolean isFirstLine = true; while ((line = reader.readLine()) != null) { @@ -113,7 +113,7 @@ public class Xml2CsvExampleUnitTest { Xml2CsvExample.convertXml2CsvStax(DATA_XML, TEMP_OUTPUT_CSV); File csvFile = new File(TEMP_OUTPUT_CSV); - try(BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { + try (BufferedReader reader = new BufferedReader(new FileReader(csvFile))) { String line; boolean isFirstLine = true; while ((line = reader.readLine()) != null) { From 3e5904ed8cd9ce15beb96fc4df126c2d4a03f12b Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:10:52 +0100 Subject: [PATCH 629/831] JAVA-26765: Update persistence-modules/core-java-persistence to new mysql connector --- persistence-modules/core-java-persistence/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index e8add07fbf..e0300f5b9c 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/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 com.baeldung.core-java-persistence core-java-persistence @@ -53,8 +53,8 @@ ${springframework.boot.spring-boot-starter.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector.version} runtime @@ -66,7 +66,7 @@ 0.9.5.5 3.0.4 6.0.6 - 8.0.32 + 8.2.0 \ No newline at end of file From 8c3b770e4bd1bdc5b6801febc38053301de43250 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:19:32 +0100 Subject: [PATCH 630/831] JAVA-26765: Update persistence-modules/ibernate-queries to new mysql connector --- persistence-modules/hibernate-queries/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index 76f230a72d..0a736346a4 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -60,8 +60,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -96,7 +96,7 @@ 6.0.6 3.0.3 9.0.0.M26 - 8.0.32 + 8.2.0 2.6.0 2.1.214 6.3.1.Final From b180714d75ac41a559230e3535f15d80c63ecaa7 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:21:15 +0100 Subject: [PATCH 631/831] JAVA-26765: Update persistence-modules/spring-jpa to new mysql connector --- persistence-modules/spring-jpa/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 10e44c0ce4..91766318e6 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/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-jpa 0.1-SNAPSHOT @@ -54,8 +54,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -117,7 +117,7 @@ 6.0.6 3.29.2-GA - 8.0.33 + 8.2.0 3.1.0 6.0.0 From 78a3c17a3e619d0af3dbe47e702eef5e643d5460 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:24:44 +0100 Subject: [PATCH 632/831] JAVA-26765: Update persistence-modules/apache-cayenne to new mysql connector --- persistence-modules/apache-cayenne/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml index 87bf6fe30b..3715198d84 100644 --- a/persistence-modules/apache-cayenne/pom.xml +++ b/persistence-modules/apache-cayenne/pom.xml @@ -22,8 +22,8 @@ ${cayenne.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.connector.version} runtime @@ -40,7 +40,7 @@ - 5.1.44 + 8.2.0 4.0.M5 From 6fbaa02f92a0c94badf78fc00593557b828a6d1d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:28:38 +0100 Subject: [PATCH 633/831] JAVA-26765: Update persistence-modules/core-java-persistence-2 to new mysql connector --- persistence-modules/core-java-persistence-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml index 2013bdb6af..dea261adca 100644 --- a/persistence-modules/core-java-persistence-2/pom.xml +++ b/persistence-modules/core-java-persistence-2/pom.xml @@ -28,8 +28,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.driver.version} @@ -85,7 +85,7 @@ 8.4.1.jre11 10.2.0.4.0 - 8.0.22 + 8.2.0 3.11.11 20220320 07.00.00-MS-GA From 844e537a5323ab630e471a70adab1de57058d1a0 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:32:04 +0100 Subject: [PATCH 634/831] JAVA-26765: Update persistence-modules/java-jpa to new mysql connector --- persistence-modules/java-jpa/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index b96b24582e..169a2e8fd7 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -70,8 +70,8 @@ ${javax.annotation.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -135,7 +135,7 @@ 2.1.214 4.0.0 1.3.2 - 8.0.33 + 8.2.0 \ No newline at end of file From a8db23aac25d2946102f7a1c894cb850e013ee61 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:36:50 +0100 Subject: [PATCH 635/831] JAVA-26765: Update persistence-modules/java-jpa-3 to new mysql connector --- persistence-modules/java-jpa-3/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index 0237da7ece..fa3a972623 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -29,8 +29,8 @@ ${h2.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -86,7 +86,7 @@ 5.4.14.Final 2.7.4 - 8.0.21 + 8.2.0 2.2 3.3.3 3.0.0 From 0f05a581e20ffa31e1fd7d7cf909f4bb43935fde Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:37:13 +0100 Subject: [PATCH 636/831] JAVA-26765: Update persistence-modules/spring-boot-persistence-2 to new mysql connector --- persistence-modules/spring-boot-persistence-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 6bca6df2b9..7d6b6909c4 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -94,8 +94,8 @@ tomcat-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -135,7 +135,7 @@ 2.0.7 1.4.6 - 8.0.33 + 8.2.0 \ No newline at end of file From 15b097bb8af8849eeaf9ef64ec74689bcdd52a20 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:44:04 +0100 Subject: [PATCH 637/831] JAVA-26765: Update persistence-modules/liquibase to new mysql connector --- persistence-modules/liquibase/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index 2fc5803037..90397aec4d 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -14,8 +14,8 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -36,7 +36,7 @@ - 5.1.6 + 8.2.0 3.4.2 From e512b83e8bfbf92ca443e35137a75017c459ec3e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:46:01 +0100 Subject: [PATCH 638/831] JAVA-26765: Update persistence-modules/spring-boto-mysql to new mysql connector --- persistence-modules/spring-boot-mysql/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index de1836797c..5c392d2464 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -33,8 +33,8 @@ true - mysql - mysql-connector-java + com.mysql + mysql-connector-j From 4245d664b700e8919b2cf8e838453885ba221092 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:48:44 +0100 Subject: [PATCH 639/831] JAVA-26765: Update persistence-modules/spring-hibernate-5 to new mysql connector --- persistence-modules/spring-hibernate-5/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index e559fe1394..32441473bb 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -99,8 +99,8 @@ ${hsqldb.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -133,7 +133,7 @@ 5.2.10.Final 5.8.2.Final - 8.0.7-dmr + 8.2.0 9.0.0.M26 1.1 2.3.0.1 From ac8d8ef5c965d18b08441394a70ba93e20740f39 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:50:52 +0100 Subject: [PATCH 640/831] JAVA-26765: Update persistence-modules/read-only-transactions to new mysql connector --- persistence-modules/read-only-transactions/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/read-only-transactions/pom.xml b/persistence-modules/read-only-transactions/pom.xml index 9a347fde88..c485a0d2a8 100644 --- a/persistence-modules/read-only-transactions/pom.xml +++ b/persistence-modules/read-only-transactions/pom.xml @@ -38,8 +38,8 @@ test - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -67,7 +67,7 @@ - 8.0.21 + 8.2.0 4.0.3 5.6.1.Final 2.6.1 From 93ac0a07dc684975f28c8c345c5f7bdaae203518 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:53:37 +0100 Subject: [PATCH 641/831] JAVA-26765: Update persistence-modules/hibernate5 to new mysql connector --- persistence-modules/hibernate5/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 1a2c65c6ba..f93fe6c9e7 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -30,8 +30,8 @@ ${hibernate.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql.version} @@ -58,7 +58,7 @@ 5.4.24.Final - 6.0.6 + 8.2.0 2.2.3 2.1.214 From 2fd61d0f0b43befcc38a10dc79597d690ee03d8d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:57:36 +0100 Subject: [PATCH 642/831] JAVA-26765: Update persistence-modules/spring-hibernate-3 to new mysql connector --- persistence-modules/spring-hibernate-3/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml index 306c4995d2..61b253d0d2 100644 --- a/persistence-modules/spring-hibernate-3/pom.xml +++ b/persistence-modules/spring-hibernate-3/pom.xml @@ -37,8 +37,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -79,7 +79,7 @@ 3.21.0-GA 3.6.10.Final - 5.1.40 + 8.2.0 8.5.8 From b8c35c0c10345346fa67983b1585c71662f47fdc Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 04:58:58 +0100 Subject: [PATCH 643/831] JAVA-26765: Update persistence-modules/flyway to new mysql connector --- persistence-modules/flyway/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index 18ff9fdb39..df35f85bfb 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -25,8 +25,8 @@ spring-boot-starter-jdbc - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 9088596b1eeb51e539f6a1e5cc4d1e0ed2761123 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:18:45 +0100 Subject: [PATCH 644/831] JAVA-26765: Update persistence-modules/parent-boot-2 to new mysql connector --- parent-boot-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index b79be81a66..9b40dbbe8e 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -25,8 +25,8 @@ import - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -106,7 +106,7 @@ 1.0.22.RELEASE 2.7.11 1.9.20.1 - 8.0.31 + 8.2.0 \ No newline at end of file From 882016134cf95f69e7388b4303e8f45c15414eee Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:20:55 +0100 Subject: [PATCH 645/831] JAVA-26765: Update persistence-modules/spring-exceptions to new mysql connector --- spring-exceptions/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml index e0071a4206..02a531fe18 100644 --- a/spring-exceptions/pom.xml +++ b/spring-exceptions/pom.xml @@ -60,8 +60,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} runtime @@ -162,7 +162,7 @@ 3.21.0-GA 5.2.5.Final - 5.1.40 + 8.2.0 7.0.73 10.13.1.1 From 13ffae329e11628ab23d65a40e9ae37ac112832e Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:23:41 +0100 Subject: [PATCH 646/831] JAVA-26765: Update persistence-modules/spring-mvc-forms-jsp to new mysql connector --- spring-web-modules/spring-mvc-forms-jsp/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-web-modules/spring-mvc-forms-jsp/pom.xml b/spring-web-modules/spring-mvc-forms-jsp/pom.xml index 5096c6e23d..636551b555 100644 --- a/spring-web-modules/spring-mvc-forms-jsp/pom.xml +++ b/spring-web-modules/spring-mvc-forms-jsp/pom.xml @@ -43,8 +43,8 @@ ${jstl.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j ${mysql-connector-java.version} @@ -104,7 +104,7 @@ 8.0.1.Final 5.2.5.Final - 6.0.6 + 8.2.0 1.3.2 From 349091f9e05b26dd5f648fcf0ee33a0abc02eb5d Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:26:06 +0100 Subject: [PATCH 647/831] JAVA-26765: Update persistence-modules/spring-rest-testing to new mysql connector --- spring-web-modules/spring-rest-testing/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-rest-testing/pom.xml b/spring-web-modules/spring-rest-testing/pom.xml index 67b3115a6f..db1ec6c165 100644 --- a/spring-web-modules/spring-rest-testing/pom.xml +++ b/spring-web-modules/spring-rest-testing/pom.xml @@ -103,8 +103,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From 4c05325ee09c976dceb48569d4c761d0dbc2b8d6 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:28:20 +0100 Subject: [PATCH 648/831] JAVA-26765: Update persistence-modules/spring-rest-query-language to new mysql connector --- spring-web-modules/spring-rest-query-language/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-web-modules/spring-rest-query-language/pom.xml b/spring-web-modules/spring-rest-query-language/pom.xml index 987d678439..b44972603d 100644 --- a/spring-web-modules/spring-rest-query-language/pom.xml +++ b/spring-web-modules/spring-rest-query-language/pom.xml @@ -140,8 +140,8 @@ ${javassist.version} - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From cf03d6e96b0311e4df08baa3def4721811d5e0de Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:30:32 +0100 Subject: [PATCH 649/831] JAVA-26765: Update persistence-modules/cas-secured-app to new mysql connector --- security-modules/cas/cas-secured-app/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/security-modules/cas/cas-secured-app/pom.xml b/security-modules/cas/cas-secured-app/pom.xml index 7c4864b1c0..b5ac123b21 100644 --- a/security-modules/cas/cas-secured-app/pom.xml +++ b/security-modules/cas/cas-secured-app/pom.xml @@ -41,8 +41,8 @@ spring-boot-starter-data-jpa - mysql - mysql-connector-java + com.mysql + mysql-connector-j runtime From e4d65e524fcde125cbfdd36b3f61590b3d823dfd Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 05:38:17 +0100 Subject: [PATCH 650/831] Fix: spring-boot-mysql --- persistence-modules/spring-boot-mysql/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 5c392d2464..6c19b92314 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -56,7 +56,7 @@ - 8.0.23 + 8.2.0 \ No newline at end of file From 79e9818bee9d402d6815f7e97643702a7e6e7dd2 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 23 Nov 2023 06:21:19 +0100 Subject: [PATCH 651/831] JAVA-26530: Update the RectangleOverlap adding a method without borders check. --- .../rectanglesoverlap/Rectangle.java | 22 ++++++++++++++----- .../rectanglesoverlap/RectangleUnitTest.java | 17 +++++++++++++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java index 38f5edec61..ee43af3eff 100644 --- a/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java +++ b/core-java-modules/core-java-lang-math-2/src/main/java/com/baeldung/algorithms/rectanglesoverlap/Rectangle.java @@ -26,13 +26,25 @@ public class Rectangle { this.topRight = topRight; } - public boolean isOverlapping(Rectangle other) { - // one rectangle is to the top of the other - if (this.topRight.getY() < other.bottomLeft.getY() || this.bottomLeft.getY() > other.topRight.getY()) { + public boolean isOverlapping(Rectangle comparedRectangle) { + // one rectangle is to the top of the comparedRectangle + if (this.topRight.getY() < comparedRectangle.bottomLeft.getY() || this.bottomLeft.getY() > comparedRectangle.topRight.getY()) { return false; } - // one rectangle is to the left of the other - if (this.topRight.getX() < other.bottomLeft.getX() || this.bottomLeft.getX() > other.topRight.getX()) { + // one rectangle is to the left of the comparedRectangle + if (this.topRight.getX() < comparedRectangle.bottomLeft.getX() || this.bottomLeft.getX() > comparedRectangle.topRight.getX()) { + return false; + } + return true; + } + + public boolean isOverlappingWithoutBorders(Rectangle comparedRectangle) { + // one rectangle is to the top of the comparedRectangle + if (this.topRight.getY() <= comparedRectangle.bottomLeft.getY() || this.bottomLeft.getY() >= comparedRectangle.topRight.getY()) { + return false; + } + // one rectangle is to the left of the comparedRectangle + if (this.topRight.getX() <= comparedRectangle.bottomLeft.getX() || this.bottomLeft.getX() >= comparedRectangle.topRight.getX()) { return false; } return true; diff --git a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java index e4bb614b48..18186b43b1 100644 --- a/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java +++ b/core-java-modules/core-java-lang-math-2/src/test/java/com/baeldung/algorithms/rectanglesoverlap/RectangleUnitTest.java @@ -1,7 +1,8 @@ package com.baeldung.algorithms.rectanglesoverlap; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import org.junit.Test; public class RectangleUnitTest { @@ -36,4 +37,18 @@ public class RectangleUnitTest { assertFalse(rectangle1.isOverlapping(rectangle2)); } + @Test + public void givenAdjacentRectangles_whensOverlappingCalled_shouldReturnTrue() { +Rectangle rectangle1 = new Rectangle(new Point(0, 0), new Point(5, 14)); +Rectangle rectangle2 = new Rectangle(new Point(5, 0), new Point(17, 14)); +assertTrue(rectangle1.isOverlapping(rectangle2)); + } + + @Test + public void givenAdjacentRectangles_whensOverlappingWithoutBordersCalled_shouldReturnFalse() { + Rectangle rectangle1 = new Rectangle(new Point(0, 0), new Point(5, 14)); + Rectangle rectangle2 = new Rectangle(new Point(5, 0), new Point(17, 14)); + assertFalse(rectangle1.isOverlappingWithoutBorders(rectangle2)); + } + } From 81fe96721a53dff2a8c3ecc28ba53984bb98fd16 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Thu, 23 Nov 2023 13:03:09 +0100 Subject: [PATCH 652/831] [negate-int] negate an int in java --- .../baeldung/negate/NegateIntUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java new file mode 100644 index 0000000000..15fffde6ed --- /dev/null +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.negate; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class NegateIntUnitTest { + @Test + void whenUsingUnaryMinusOperator_thenGetExpectedResult() { + int x = 42; + assertEquals(-42, -x); + + int z = 0; + assertEquals(0, -z); + + int n = -42; + assertEquals(42, -n); + } + + @Test + void whenUsingBitwiseComplementOperator_thenGetExpectedResult() { + int x = 42; + assertEquals(-42, ~x + 1); + + int z = 0; + assertEquals(0, ~z + 1); + + int n = -42; + assertEquals(42, ~n + 1); + } + + @Test + void whenUsingUnaryMinusOperatorWithMinInt_thenCannotGetExpectedResult() { + int min = Integer.MIN_VALUE; + System.out.println("The value of '-min' is: " + -min); + assertFalse((-min) > 0); + } + + @Test + void whenUsingBitwiseComplementOperatorWithMinInt_thenCannotGetExpectedResult() { + int min = Integer.MIN_VALUE; + int result = ~min + 1; + System.out.println("The value of '~min + 1' is: " + result); + assertFalse(result > 0); + } + + + @Test + void whenUsingUnaryMinusOperatorWithMinInt_thenGetExpectedResult() { + int x = 42; + assertEquals(-42, Math.negateExact(x)); + + int z = 0; + assertEquals(0, Math.negateExact(z)); + + int n = -42; + assertEquals(42, Math.negateExact(n)); + + int min = Integer.MIN_VALUE; + assertThrowsExactly(ArithmeticException.class, () -> Math.negateExact(min)); + } +} \ No newline at end of file From 8d440a419b62770092e4a0a4082763f2031b8609 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 23 Nov 2023 21:26:53 +0530 Subject: [PATCH 653/831] BAEL-7200 fixed formatting. Used default intellij formatting for Fluent API style. --- .../modifyrequest/EscapeHtmlAspectIntegrationTest.java | 8 ++++---- .../modifyrequest/EscapeHtmlFilterIntegrationTest.java | 8 ++++---- .../EscapeHtmlInterceptorIntegrationTest.java | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java index 665733c61b..12520b7e67 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java @@ -44,9 +44,9 @@ public class EscapeHtmlAspectIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().isCreated()) - .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java index 35254eb151..3ab7618b05 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java @@ -43,9 +43,9 @@ public class EscapeHtmlFilterIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().isCreated()) - .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().isCreated()) + .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java index 002481de4f..d855339bd9 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java @@ -39,8 +39,8 @@ public class EscapeHtmlInterceptorIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().is4xxClientError()); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status().is4xxClientError()); } } From 6e11ac36a26a1ee5e67bdad3285b58da4589944a Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 18:45:27 +0100 Subject: [PATCH 654/831] JAVA-26765: Remove unwanted spaces from bookstore-monolith --- jhipster-6/bookstore-monolith/pom.xml | 66 +++++++++++++-------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index 2a5368c9ac..efe3d2a118 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -90,10 +90,10 @@ io.springfox springfox-bean-validators - - - - + + + + com.zaxxer HikariCP @@ -136,10 +136,10 @@ net.logstash.logback logstash-logback-encoder - - - - + + + + org.mapstruct mapstruct @@ -423,28 +423,28 @@ jib-maven-plugin ${jib-maven-plugin.version} - - openjdk:8-jre-alpine - - - bookstore:latest - - - - sh - - chmod +x /entrypoint.sh && sync && /entrypoint.sh - - - 8080 - - - ALWAYS - 0 - - true - - + + openjdk:8-jre-alpine + + + bookstore:latest + + + + sh + + chmod +x /entrypoint.sh && sync && /entrypoint.sh + + + 8080 + + + ALWAYS + 0 + + true + + org.liquibase @@ -1137,9 +1137,9 @@ jdt_apt false - - - + + + 3.0.1 From 60e843aa61af674f968c6bcaa4cbd16bde97009f Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 20:59:14 +0100 Subject: [PATCH 655/831] JAVA-26771: Update core-java-string-operations-7 liquibase-core to 4.25.0 --- core-java-modules/core-java-string-operations-7/pom.xml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-string-operations-7/pom.xml b/core-java-modules/core-java-string-operations-7/pom.xml index a2c7036e34..33a74365bc 100644 --- a/core-java-modules/core-java-string-operations-7/pom.xml +++ b/core-java-modules/core-java-string-operations-7/pom.xml @@ -24,12 +24,6 @@ commons-text ${commons-text.version} - - org.liquibase - liquibase-core - 4.9.1 - test - org.junit.jupiter junit-jupiter @@ -39,7 +33,7 @@ org.liquibase liquibase-core - 4.9.1 + ${liquibase.core.version} test @@ -67,6 +61,7 @@ 11 3.13.0 1.10.0 + 4.25.0 \ No newline at end of file From 851975605c2fa33e3fa113e9ac6ad008294d7aec Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 21:06:52 +0100 Subject: [PATCH 656/831] JAVA-26771: Update quarkus-extension liquibase-core to 4.25.0 --- .../quarkus-extension/quarkus-liquibase/runtime/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quarkus-modules/quarkus-extension/quarkus-liquibase/runtime/pom.xml b/quarkus-modules/quarkus-extension/quarkus-liquibase/runtime/pom.xml index 95916932a1..f1fe9eec5c 100644 --- a/quarkus-modules/quarkus-extension/quarkus-liquibase/runtime/pom.xml +++ b/quarkus-modules/quarkus-extension/quarkus-liquibase/runtime/pom.xml @@ -66,8 +66,7 @@ - 3.8.1 - 3.8.1 + 4.25.0 \ No newline at end of file From bb7481a27ac57dcb37806b88815215a365fa9648 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 21:07:17 +0100 Subject: [PATCH 657/831] JAVA-26771: Update persistence-modules/liquibase liquibase-maven-plugin to 4.25.0 --- persistence-modules/liquibase/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index 2fc5803037..f822c5b320 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -37,7 +37,7 @@ 5.1.6 - 3.4.2 + 4.25.0 \ No newline at end of file From 4f960b65795e16fd29a0dc787453f4c041d436e8 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 21:52:20 +0100 Subject: [PATCH 658/831] JAVA-26771: Fix test core-java-string-operations-7 --- .../java/com/baeldung/centertext/CenteringTextUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java index a3f95b0181..408d7b1a63 100644 --- a/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java +++ b/core-java-modules/core-java-string-operations-7/src/test/java/com/baeldung/centertext/CenteringTextUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.centertext; -import liquibase.repackaged.org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.jupiter.api.Test; From 179e6e5de26ec55ccbd3dc8194c15f76575bc349 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Fri, 24 Nov 2023 00:13:52 +0100 Subject: [PATCH 659/831] JAVA-26765: Remove unwanted spaces from xml --- patterns-modules/design-patterns-architectural/pom.xml | 4 ++-- persistence-modules/activejdbc/pom.xml | 4 ++-- persistence-modules/core-java-persistence/pom.xml | 4 ++-- persistence-modules/hibernate-libraries/pom.xml | 4 ++-- persistence-modules/spring-data-jpa-repo/pom.xml | 4 ++-- persistence-modules/spring-data-rest-querydsl/pom.xml | 4 ++-- persistence-modules/spring-hibernate-6/pom.xml | 4 ++-- persistence-modules/spring-jdbc/pom.xml | 4 ++-- persistence-modules/spring-jpa/pom.xml | 4 ++-- spring-boot-modules/spring-boot-data-3/pom.xml | 4 ++-- spring-cloud-modules/spring-cloud-aws/pom.xml | 4 ++-- .../spring-cloud-task/springcloudtaskbatch/pom.xml | 4 ++-- spring-cloud-modules/spring-cloud-vault/pom.xml | 4 ++-- spring-security-modules/spring-security-web-boot-1/pom.xml | 4 ++-- spring-security-modules/spring-security-web-boot-2/pom.xml | 4 ++-- web-modules/java-lite/pom.xml | 4 ++-- web-modules/vraptor/pom.xml | 4 ++-- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index addcdfe390..20f320f073 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/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 design-patterns-architectural 1.0 diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml index 602235b892..e41af5c64b 100644 --- a/persistence-modules/activejdbc/pom.xml +++ b/persistence-modules/activejdbc/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 activejdbc 1.0-SNAPSHOT diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index e0300f5b9c..5d5c36ef01 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/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 com.baeldung.core-java-persistence core-java-persistence diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml index 15292689eb..5b1879b78e 100644 --- a/persistence-modules/hibernate-libraries/pom.xml +++ b/persistence-modules/hibernate-libraries/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 hibernate-libraries 0.0.1-SNAPSHOT diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml index debf9690f6..1c58b5afa5 100644 --- a/persistence-modules/spring-data-jpa-repo/pom.xml +++ b/persistence-modules/spring-data-jpa-repo/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-jpa-repo spring-data-jpa-repo diff --git a/persistence-modules/spring-data-rest-querydsl/pom.xml b/persistence-modules/spring-data-rest-querydsl/pom.xml index 89db7d24a5..0fe9d381cf 100644 --- a/persistence-modules/spring-data-rest-querydsl/pom.xml +++ b/persistence-modules/spring-data-rest-querydsl/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 spring-data-rest-querydsl 1.0 diff --git a/persistence-modules/spring-hibernate-6/pom.xml b/persistence-modules/spring-hibernate-6/pom.xml index f3ea82dfad..3cd69a963e 100644 --- a/persistence-modules/spring-hibernate-6/pom.xml +++ b/persistence-modules/spring-hibernate-6/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-hibernate-6 0.1-SNAPSHOT diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml index 1aa9f4f851..1cf4c141b3 100644 --- a/persistence-modules/spring-jdbc/pom.xml +++ b/persistence-modules/spring-jdbc/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-jdbc spring-jdbc diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 91766318e6..61950d9c93 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/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-jpa 0.1-SNAPSHOT diff --git a/spring-boot-modules/spring-boot-data-3/pom.xml b/spring-boot-modules/spring-boot-data-3/pom.xml index 7c0f4b3ffd..4afafe3c19 100644 --- a/spring-boot-modules/spring-boot-data-3/pom.xml +++ b/spring-boot-modules/spring-boot-data-3/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung spring-boot-data-3 diff --git a/spring-cloud-modules/spring-cloud-aws/pom.xml b/spring-cloud-modules/spring-cloud-aws/pom.xml index 328ddd50de..3de0c7146a 100644 --- a/spring-cloud-modules/spring-cloud-aws/pom.xml +++ b/spring-cloud-modules/spring-cloud-aws/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 com.baeldung.spring.cloud spring-cloud-aws diff --git a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml index f7c13e881f..53bc37212c 100644 --- a/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud-modules/spring-cloud-task/springcloudtaskbatch/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 com.baeldung.cloud springcloudtaskbatch diff --git a/spring-cloud-modules/spring-cloud-vault/pom.xml b/spring-cloud-modules/spring-cloud-vault/pom.xml index 58a28bdf5a..1698b1f357 100644 --- a/spring-cloud-modules/spring-cloud-vault/pom.xml +++ b/spring-cloud-modules/spring-cloud-vault/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 com.baeldung.spring.cloud spring-cloud-vault diff --git a/spring-security-modules/spring-security-web-boot-1/pom.xml b/spring-security-modules/spring-security-web-boot-1/pom.xml index baa9f8e1e5..e93b0b4f03 100644 --- a/spring-security-modules/spring-security-web-boot-1/pom.xml +++ b/spring-security-modules/spring-security-web-boot-1/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-web-boot-1 0.0.1-SNAPSHOT diff --git a/spring-security-modules/spring-security-web-boot-2/pom.xml b/spring-security-modules/spring-security-web-boot-2/pom.xml index 7dcba3cd3e..d3684dd282 100644 --- a/spring-security-modules/spring-security-web-boot-2/pom.xml +++ b/spring-security-modules/spring-security-web-boot-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-web-boot-2 0.0.1-SNAPSHOT diff --git a/web-modules/java-lite/pom.xml b/web-modules/java-lite/pom.xml index 024d38420e..be079d484e 100644 --- a/web-modules/java-lite/pom.xml +++ b/web-modules/java-lite/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 org.baeldung java-lite diff --git a/web-modules/vraptor/pom.xml b/web-modules/vraptor/pom.xml index b26a29e004..d952cd71e5 100644 --- a/web-modules/vraptor/pom.xml +++ b/web-modules/vraptor/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 vraptor vraptor From c519d2be47c15ecad61d3f9e21b3e198c565d352 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 24 Nov 2023 09:35:01 +0000 Subject: [PATCH 660/831] https://jira.baeldung.com/browse/BAEL-7268 --- .../baeldung/unixtime/UnixTimeUnitTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java new file mode 100644 index 0000000000..d1518ceef5 --- /dev/null +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung.unixtime; + + +import static org.junit.Assert.assertEquals; + +import java.time.Instant; +import java.util.Date; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.jupiter.api.Test; + +public class UnixTimeUnitTest { + + @Test + public void givenCurrentTimeUsingDateApi_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + Date date = new Date(); + long longTime = date.getTime() / 1000L; + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + + @Test + public void givenCurrentTimeUsingInstantNow_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + long longTime = Instant.now().getEpochSecond(); + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + + @Test + public void givenCurrentTimeUsingJodaTime_whenConvertedToUnixTime_thenConsistent() { + long marginOfError = 1L; + DateTime dateTime = DateTime.now(DateTimeZone.UTC); + long longTime = dateTime.getMillis() / 1000L; + + for (int i = 0; i < 10; i++) { + long unixTime = System.currentTimeMillis() / 1000L; + assertEquals(longTime, unixTime, marginOfError); + } + } + +} From 4e28968b06a6990392971c89717c518882e0d626 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:12:43 +0800 Subject: [PATCH 661/831] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-advanced-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-advanced-5/README.md b/core-java-modules/core-java-concurrency-advanced-5/README.md index ba845a7c4b..d991b6cc34 100644 --- a/core-java-modules/core-java-concurrency-advanced-5/README.md +++ b/core-java-modules/core-java-concurrency-advanced-5/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Why wait() Requires Synchronization?](https://www.baeldung.com/java-wait-necessary-synchronization) +- [Working with Exceptions in Java CompletableFuture](https://www.baeldung.com/java-exceptions-completablefuture) From 9b36358c6c4405aabeaa8bb8f209cef647e508fe Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:18:13 +0800 Subject: [PATCH 662/831] Update README.md [skip ci] --- spring-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-kafka-2/README.md b/spring-kafka-2/README.md index 43b2f59147..250927314c 100644 --- a/spring-kafka-2/README.md +++ b/spring-kafka-2/README.md @@ -9,3 +9,4 @@ This module contains articles about Spring with Kafka - [Understanding Kafka Topics and Partitions](https://www.baeldung.com/kafka-topics-partitions) - [How to Subscribe a Kafka Consumer to Multiple Topics](https://www.baeldung.com/kafka-subscribe-consumer-multiple-topics) - [Splitting Streams in Kafka](https://www.baeldung.com/kafka-splitting-streams) +- [Manage Kafka Consumer Groups](https://www.baeldung.com/kafka-manage-consumer-groups) From 33c1b23627c9a8b5f3db4643d36384e8ce95e948 Mon Sep 17 00:00:00 2001 From: mikr Date: Fri, 24 Nov 2023 14:20:26 +0100 Subject: [PATCH 663/831] Update readme --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index a62bdda7af..c9f39dd2fa 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -4,4 +4,5 @@ - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) +- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-max-size) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) \ No newline at end of file From 6ced5e2c2f8a616d64c6b820ce98d9c170ae8254 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:22:32 +0800 Subject: [PATCH 664/831] Update README.md [skip ci] --- core-java-modules/core-java-datetime-conversion/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md index d3a3dae728..c7ba333222 100644 --- a/core-java-modules/core-java-datetime-conversion/README.md +++ b/core-java-modules/core-java-datetime-conversion/README.md @@ -10,3 +10,4 @@ This module contains articles about converting between Java date and time object - [Convert Between LocalDateTime and ZonedDateTime](https://www.baeldung.com/java-localdatetime-zoneddatetime) - [Conversion From 12-Hour Time to 24-Hour Time in Java](https://www.baeldung.com/java-convert-time-format) - [Convert Epoch Time to LocalDate and LocalDateTime](https://www.baeldung.com/java-convert-epoch-localdate) +- [Convert Timestamp String to Long in Java](https://www.baeldung.com/java-convert-timestamp-string-long) From 8b481ed4d43f30989352bee13b19761fa982d948 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:27:11 +0800 Subject: [PATCH 665/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-5/README.md b/core-java-modules/core-java-collections-5/README.md index acee8154f7..c9fce58ac2 100644 --- a/core-java-modules/core-java-collections-5/README.md +++ b/core-java-modules/core-java-collections-5/README.md @@ -10,4 +10,5 @@ - [Remove Elements From a Queue Using Loop](https://www.baeldung.com/java-remove-elements-queue) - [Intro to Vector Class in Java](https://www.baeldung.com/java-vector-guide) - [HashSet toArray() Method in Java](https://www.baeldung.com/java-hashset-toarray) +- [Time Complexity of Java Collections Sort in Java](https://www.baeldung.com/java-time-complexity-collections-sort) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-4) From ba158d4e7bc459c57a690f6687c14299b5e8ae08 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:31:16 +0800 Subject: [PATCH 666/831] Update README.md [skip ci] --- xml-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml-2/README.md b/xml-2/README.md index e9c1a07586..a6762f2840 100644 --- a/xml-2/README.md +++ b/xml-2/README.md @@ -9,3 +9,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Converting JSON to XML in Java](https://www.baeldung.com/java-convert-json-to-xml) - [Convert an XML Object to a String in Java](https://www.baeldung.com/java-convert-xml-object-string) - [Convert String Containing XML to org.w3c.dom.Document](https://www.baeldung.com/java-convert-string-xml-dom) +- [How to Parse XML to HashMap in Java](https://www.baeldung.com/java-xml-read-into-hashmap) From a4c30e423d457ed41b1180a5f8d87a0b75b26154 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:35:59 +0800 Subject: [PATCH 667/831] Update README.md [skip ci] --- core-java-modules/core-java-string-operations-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-string-operations-7/README.md b/core-java-modules/core-java-string-operations-7/README.md index 2b9c4c25f3..a05485ccb9 100644 --- a/core-java-modules/core-java-string-operations-7/README.md +++ b/core-java-modules/core-java-string-operations-7/README.md @@ -5,3 +5,4 @@ - [Check if a String Contains Only Unicode Letters](https://www.baeldung.com/java-string-all-unicode-characters) - [Create a Mutable String in Java](https://www.baeldung.com/java-mutable-string) - [Check if a String Contains a Number Value in Java](https://www.baeldung.com/java-string-number-presence) +- [Difference Between String isEmpty() and isBlank()](https://www.baeldung.com/java-string-isempty-vs-isblank) From 9d20500b64b71bfac5a48c85bc416c539050037f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:38:30 +0800 Subject: [PATCH 668/831] Update README.md [skip ci] --- testing-modules/testing-assertions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/testing-assertions/README.md b/testing-modules/testing-assertions/README.md index 8f94277791..3e529bc1d3 100644 --- a/testing-modules/testing-assertions/README.md +++ b/testing-modules/testing-assertions/README.md @@ -6,3 +6,4 @@ - [Assert That an Object Is From a Specific Type](https://www.baeldung.com/java-assert-object-of-type) - [Asserting Equality on Two Classes Without an equals() Method](https://www.baeldung.com/java-assert-equality-no-equals) - [Assert Regex Matches in JUnit](https://www.baeldung.com/junit-assert-regex-matches) +- [Asserting Nested Map With JUnit](https://www.baeldung.com/junit-assert-nested-map) From 9b63e853fde797fd85674741aca438156b652003 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:40:18 +0800 Subject: [PATCH 669/831] Update README.md [skip ci] --- core-java-modules/core-java-17/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-17/README.md b/core-java-modules/core-java-17/README.md index 4b1125532d..44a4e760e1 100644 --- a/core-java-modules/core-java-17/README.md +++ b/core-java-modules/core-java-17/README.md @@ -9,3 +9,4 @@ - [Migrate From Java 8 to Java 17](https://www.baeldung.com/java-migrate-8-to-17) - [Format Multiple ‘or’ Conditions in an If Statement in Java](https://www.baeldung.com/java-multiple-or-conditions-if-statement) - [Get All Record Fields and Its Values via Reflection](https://www.baeldung.com/java-reflection-record-fields-values) +- [Context-Specific Deserialization Filters in Java 17](https://www.baeldung.com/java-context-specific-deserialization-filters) From 8cccab08767dac451209f87da3f84a0d4bc9844a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:46:06 +0800 Subject: [PATCH 670/831] Update README.md [skip ci] --- spring-di-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-di-4/README.md b/spring-di-4/README.md index 8e73aff437..bed8b5a78d 100644 --- a/spring-di-4/README.md +++ b/spring-di-4/README.md @@ -7,4 +7,5 @@ This module contains articles about dependency injection with Spring - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) - [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) - [Why Is Field Injection Not Recommended?](https://www.baeldung.com/java-spring-field-injection-cons) +- [Setting a Spring Bean to Null](https://www.baeldung.com/spring-setting-bean-null) - More articles: [[<-- prev]](../spring-di-3) From f52997ad42f4e7583406226d96808693c3b8d730 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 24 Nov 2023 21:53:03 +0800 Subject: [PATCH 671/831] Update README.md [skip ci] --- core-java-modules/core-java-lang-oop-types-2/README.md | 1 + 1 file changed, 1 insertion(+) 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 f46a1a3306..208e3b7fa7 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 @@ -10,3 +10,4 @@ This module contains articles about types in Java - [Filling a List With All Enum Values in Java](https://www.baeldung.com/java-enum-values-to-list) - [Comparing a String to an Enum Value in Java](https://www.baeldung.com/java-comparing-string-to-enum) - [Implementing toString() on enums in Java](https://www.baeldung.com/java-enums-tostring) +- [Checking if an Object’s Type Is Enum](https://www.baeldung.com/java-check-object-enum) From 39a7c066059b7db29fb75b98a5cc03a6d7843b5b Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:08:56 +0100 Subject: [PATCH 672/831] Remove commetn blocks Co-authored-by: Liam Williams --- .../src/main/java/com/baeldung/timefoldsolver/Shift.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java index 04087134c6..9c7b663ecd 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -34,10 +34,6 @@ public class Shift { return start + " - " + end; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public LocalDateTime getStart() { return start; } From 8e8331376ef326e5efc059a804373beb9b5311de Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:09:03 +0100 Subject: [PATCH 673/831] Remove commetn blocks Co-authored-by: Liam Williams --- .../src/main/java/com/baeldung/timefoldsolver/Employee.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java index c755896201..ef4752a8c6 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Employee.java @@ -17,10 +17,6 @@ public class Employee { return name; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public String getName() { return name; } From 2478475ceae6da380542501956604ff65fc88cd6 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:09:14 +0100 Subject: [PATCH 674/831] Remove comment blocks Co-authored-by: Liam Williams --- .../main/java/com/baeldung/timefoldsolver/ShiftSchedule.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java index 85abc8eb66..7794d46a28 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -28,10 +28,6 @@ public class ShiftSchedule { this.shifts = shifts; } - // ************************************************************************ - // Getters and setters - // ************************************************************************ - public List getEmployees() { return employees; } From 464bf4cda6c028505aaa357afa0d8c5454b9e093 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 15:12:23 +0100 Subject: [PATCH 675/831] Fields default to null. Co-authored-by: Liam Williams --- .../main/java/com/baeldung/timefoldsolver/ShiftSchedule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java index 7794d46a28..794c31e5b7 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftSchedule.java @@ -17,7 +17,7 @@ public class ShiftSchedule { private List shifts; @PlanningScore - private HardSoftScore score = null; + private HardSoftScore score; // A no-arg constructor is required for @PlanningSolution annotated classes public ShiftSchedule() { From a2acd64779fbcea91a52fb97d52e98ecd8fdf07f Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Fri, 24 Nov 2023 16:58:47 +0100 Subject: [PATCH 676/831] =?UTF-8?q?JAVA-26727:=20Update=20the=20resilience?= =?UTF-8?q?4j-timelimiter=C2=A0library=20(#15277)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * JAVA-26727: Update libraries-6 to a new version of resilience4j dependencies. * JAVA-26727: Update spring-rest-http-2 to a new version of resilience4j dependencies. --- libraries-6/pom.xml | 2 +- .../java/com/baeldung/resilence4j/Resilience4jUnitTest.java | 4 ++-- spring-web-modules/spring-rest-http-2/pom.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index 9fa44d3a32..f073ca424c 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -197,7 +197,7 @@ 1.10.0 2.7.1 4.8.1 - 0.12.1 + 2.1.0 1.15 3.6 3.5-beta72 diff --git a/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java index 1d69d20bc2..ab4d9dde40 100644 --- a/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java +++ b/libraries-6/src/test/java/com/baeldung/resilence4j/Resilience4jUnitTest.java @@ -43,7 +43,7 @@ public class Resilience4jUnitTest { // Percentage of failures to start short-circuit .failureRateThreshold(20) // Min number of call attempts - .ringBufferSizeInClosedState(5) + .slidingWindowSize(5) .build(); CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config); CircuitBreaker circuitBreaker = registry.circuitBreaker("my"); @@ -70,7 +70,7 @@ public class Resilience4jUnitTest { Future taskInProgress = callAndBlock(decorated); try { - assertThat(bulkhead.isCallPermitted()).isFalse(); + assertThat(bulkhead.tryAcquirePermission()).isFalse(); } finally { taskInProgress.cancel(true); } diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml index bcacdbbdb1..c6c8cd2010 100644 --- a/spring-web-modules/spring-rest-http-2/pom.xml +++ b/spring-web-modules/spring-rest-http-2/pom.xml @@ -51,7 +51,7 @@ 2.9.2 - 1.6.1 + 2.1.0 1.7.0 From 8abd7a07b583ea7d052c7fe99929055d42d2a28a Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:18:04 +0200 Subject: [PATCH 677/831] [JAVA-27546] Updated spring-cucumber to spring boot 3 (#15276) --- spring-cucumber/pom.xml | 11 ++++++----- .../cucumberoptions/HealthCheckController.java | 5 +++-- .../test/java/com/baeldung/SpringIntegrationTest.java | 4 +++- .../java/com/baeldung/StepDefsIntegrationTest.java | 3 ++- .../HealthCheckStepDefsIntegrationTest.java | 5 +++-- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index 042e81971f..0b0e38a2be 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 @@ -53,16 +53,17 @@ - org.apache.commons + commons-io commons-io ${commons-io.version} + + com.baeldung.SpringDemoApplication 7.14.0 - 1.3.2 - 5.10.0 + 5.10.1 \ No newline at end of file diff --git a/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java index 637dbdb540..70a917d999 100644 --- a/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java +++ b/spring-cucumber/src/main/java/com/baeldung/cucumberoptions/HealthCheckController.java @@ -3,6 +3,7 @@ package com.baeldung.cucumberoptions; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -11,12 +12,12 @@ import org.springframework.web.bind.annotation.RestController; public class HealthCheckController { @GetMapping(path = "/v1/status", produces = APPLICATION_JSON_VALUE) - public HttpStatus getV1Status() { + public HttpStatusCode getV1Status() { return ResponseEntity.ok().build().getStatusCode(); } @GetMapping(path = "/v2/status", produces = APPLICATION_JSON_VALUE) - public HttpStatus getV2Status() { + public HttpStatusCode getV2Status() { return ResponseEntity.ok().build().getStatusCode(); } } \ No newline at end of file diff --git a/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java b/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java index 7b5c4e21ff..f243c68237 100644 --- a/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java +++ b/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java @@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.client.ClientHttpResponse; import org.springframework.test.context.ContextConfiguration; import org.springframework.web.client.ResponseErrorHandler; @@ -69,7 +71,7 @@ public class SpringIntegrationTest { @Override public boolean hasError(ClientHttpResponse response) throws IOException { - hadError = response.getRawStatusCode() >= 400; + hadError = response.getStatusCode().value() >= 400; return hadError; } diff --git a/spring-cucumber/src/test/java/com/baeldung/StepDefsIntegrationTest.java b/spring-cucumber/src/test/java/com/baeldung/StepDefsIntegrationTest.java index 9611e95dcf..e4e0b2a883 100644 --- a/spring-cucumber/src/test/java/com/baeldung/StepDefsIntegrationTest.java +++ b/spring-cucumber/src/test/java/com/baeldung/StepDefsIntegrationTest.java @@ -5,6 +5,7 @@ import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -29,7 +30,7 @@ public class StepDefsIntegrationTest extends SpringIntegrationTest { @Then("^the client receives status code of (\\d+)$") public void the_client_receives_status_code_of(int statusCode) throws Throwable { - final HttpStatus currentStatusCode = latestResponse.getTheResponse().getStatusCode(); + final HttpStatusCode currentStatusCode = latestResponse.getTheResponse().getStatusCode(); assertThat("status code is incorrect : " + latestResponse.getBody(), currentStatusCode.value(), is(statusCode)); } diff --git a/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java b/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java index 999adadbef..7304f269e7 100644 --- a/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java +++ b/spring-cucumber/src/test/java/com/baeldung/cucumberoptions/HealthCheckStepDefsIntegrationTest.java @@ -3,7 +3,8 @@ package com.baeldung.cucumberoptions; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import org.springframework.http.HttpStatus; + +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; @@ -32,7 +33,7 @@ public class HealthCheckStepDefsIntegrationTest extends SpringIntegrationTest { @Then("^the client receives (\\d+) status code$") public void verifyStatusCode(int statusCode) throws Throwable { - final HttpStatus currentStatusCode = statusResponse.getStatusCode(); + final HttpStatusCode currentStatusCode = statusResponse.getStatusCode(); assertThat(currentStatusCode.value(), is(statusCode)); } } \ No newline at end of file From 789ecf458115869288c3bad28eb65f835e20b365 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 24 Nov 2023 22:03:35 +0530 Subject: [PATCH 678/831] Java 26716 Upgrade flying-saucer-pdf-openpdf, jsoup, openhtmltopdf (#15263) --- core-java-modules/core-java-networking-4/pom.xml | 2 +- jsoup/pom.xml | 2 +- .../com/baeldung/jsoup/PreservingLineBreaksUnitTest.java | 6 +++--- pdf/pom.xml | 8 ++++---- xml/pom.xml | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-networking-4/pom.xml b/core-java-modules/core-java-networking-4/pom.xml index cbe6356d0f..4b49359c8c 100644 --- a/core-java-modules/core-java-networking-4/pom.xml +++ b/core-java-modules/core-java-networking-4/pom.xml @@ -56,7 +56,7 @@ 1.7 - 1.15.4 + 1.16.2 \ No newline at end of file diff --git a/jsoup/pom.xml b/jsoup/pom.xml index 44f8f996f5..d2780424de 100644 --- a/jsoup/pom.xml +++ b/jsoup/pom.xml @@ -22,7 +22,7 @@ - 1.10.2 + 1.16.2 \ No newline at end of file diff --git a/jsoup/src/test/java/com/baeldung/jsoup/PreservingLineBreaksUnitTest.java b/jsoup/src/test/java/com/baeldung/jsoup/PreservingLineBreaksUnitTest.java index 0958fa96e2..e6bd8eccbf 100644 --- a/jsoup/src/test/java/com/baeldung/jsoup/PreservingLineBreaksUnitTest.java +++ b/jsoup/src/test/java/com/baeldung/jsoup/PreservingLineBreaksUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; -import org.jsoup.safety.Whitelist; +import org.jsoup.safety.Safelist; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -13,7 +13,7 @@ public class PreservingLineBreaksUnitTest { String strHTML = "Hello\nworld"; Document.OutputSettings outputSettings = new Document.OutputSettings(); outputSettings.prettyPrint(false); - String strWithNewLines = Jsoup.clean(strHTML, "", Whitelist.none(), outputSettings); + String strWithNewLines = Jsoup.clean(strHTML, "", Safelist.none(), outputSettings); assertEquals("Hello\nworld", strWithNewLines); } @@ -33,7 +33,7 @@ public class PreservingLineBreaksUnitTest { jsoupDoc.select("p").before("\\n"); String str = jsoupDoc.html().replaceAll("\\\\n", "\n"); String strWithNewLines = - Jsoup.clean(str, "", Whitelist.none(), outputSettings); + Jsoup.clean(str, "", Safelist.none(), outputSettings); assertEquals("Hello\nWorld\nParagraph", strWithNewLines); } } diff --git a/pdf/pom.xml b/pdf/pom.xml index 0fe90b6eb5..34094481bf 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -112,11 +112,11 @@ 1.8 3.15 3.0.11.RELEASE - 9.1.20 + 9.3.1 1.0.6 - 1.0.6 - 9.1.22 - 1.14.2 + 1.0.10 + 9.2.1 + 1.16.2 \ No newline at end of file diff --git a/xml/pom.xml b/xml/pom.xml index b56b919914..785634e265 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -372,7 +372,7 @@ 0.9.6 1.3.1 - 1.14.3 + 1.16.2 2.25 3.4 6.7.0 From c7ef62ee993ef17c16853c1b0cd6515095c7fdec Mon Sep 17 00:00:00 2001 From: Alexandru Borza Date: Fri, 24 Nov 2023 18:39:21 +0200 Subject: [PATCH 679/831] BAEL-7051 - Catch Common Mistakes with Error-Prone Library in Java (#15278) --- pom.xml | 4 +- .../error-prone-project/.mvn/jvm.config | 10 +++ static-analysis/error-prone-project/pom.xml | 61 ++++++++++++++++ .../main/java/com/baeldung/BuggyClass.java | 12 ++++ .../com/baeldung/ClassWithEmptyMethod.java | 6 ++ static-analysis/my-bugchecker-plugin/pom.xml | 56 +++++++++++++++ .../java/com/baeldung/EmptyMethodChecker.java | 24 +++++++ static-analysis/pmd/pom.xml | 20 ++++++ .../src/main/java/com/baeldung/pmd/Cnt.java | 0 .../src/main/resources/customruleset.xml | 72 +++++++++---------- .../{ => pmd}/src/main/resources/logback.xml | 0 .../java/com/baeldung/pmd/CntUnitTest.java | 0 static-analysis/pom.xml | 14 +++- 13 files changed, 240 insertions(+), 39 deletions(-) create mode 100644 static-analysis/error-prone-project/.mvn/jvm.config create mode 100644 static-analysis/error-prone-project/pom.xml create mode 100644 static-analysis/error-prone-project/src/main/java/com/baeldung/BuggyClass.java create mode 100644 static-analysis/error-prone-project/src/main/java/com/baeldung/ClassWithEmptyMethod.java create mode 100644 static-analysis/my-bugchecker-plugin/pom.xml create mode 100644 static-analysis/my-bugchecker-plugin/src/main/java/com/baeldung/EmptyMethodChecker.java create mode 100644 static-analysis/pmd/pom.xml rename static-analysis/{ => pmd}/src/main/java/com/baeldung/pmd/Cnt.java (100%) rename static-analysis/{ => pmd}/src/main/resources/customruleset.xml (96%) rename static-analysis/{ => pmd}/src/main/resources/logback.xml (100%) rename static-analysis/{ => pmd}/src/test/java/com/baeldung/pmd/CntUnitTest.java (100%) diff --git a/pom.xml b/pom.xml index 7099dd8cbc..3452ae81ee 100644 --- a/pom.xml +++ b/pom.xml @@ -889,7 +889,7 @@ spring-vault spring-web-modules spring-websockets - static-analysis + tablesaw tensorflow-java testing-modules @@ -1134,7 +1134,7 @@ spring-vault spring-web-modules spring-websockets - static-analysis + tablesaw tensorflow-java testing-modules diff --git a/static-analysis/error-prone-project/.mvn/jvm.config b/static-analysis/error-prone-project/.mvn/jvm.config new file mode 100644 index 0000000000..32599cefea --- /dev/null +++ b/static-analysis/error-prone-project/.mvn/jvm.config @@ -0,0 +1,10 @@ +--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED diff --git a/static-analysis/error-prone-project/pom.xml b/static-analysis/error-prone-project/pom.xml new file mode 100644 index 0000000000..59f7bb7270 --- /dev/null +++ b/static-analysis/error-prone-project/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + com.baeldung + static-analysis + 1.0-SNAPSHOT + + + error-prone-project + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 17 + UTF-8 + true + + -XDcompilePolicy=simple + -Xplugin:ErrorProne + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + + + com.google.errorprone + error_prone_core + ${error-prone.version} + + + com.baeldung + my-bugchecker-plugin + 1.0-SNAPSHOT + + + + + + + + + 17 + 17 + UTF-8 + + + diff --git a/static-analysis/error-prone-project/src/main/java/com/baeldung/BuggyClass.java b/static-analysis/error-prone-project/src/main/java/com/baeldung/BuggyClass.java new file mode 100644 index 0000000000..dda432ad48 --- /dev/null +++ b/static-analysis/error-prone-project/src/main/java/com/baeldung/BuggyClass.java @@ -0,0 +1,12 @@ +package com.baeldung; + +public class BuggyClass { + public static void main(String[] args) { + if (args.length == 0 || args[0] != null) { + new IllegalArgumentException(); + } + } + + public void emptyMethod() { + } +} diff --git a/static-analysis/error-prone-project/src/main/java/com/baeldung/ClassWithEmptyMethod.java b/static-analysis/error-prone-project/src/main/java/com/baeldung/ClassWithEmptyMethod.java new file mode 100644 index 0000000000..cc791ecdd4 --- /dev/null +++ b/static-analysis/error-prone-project/src/main/java/com/baeldung/ClassWithEmptyMethod.java @@ -0,0 +1,6 @@ +package com.baeldung; + +public class ClassWithEmptyMethod { + public void theEmptyMethod() { + } +} diff --git a/static-analysis/my-bugchecker-plugin/pom.xml b/static-analysis/my-bugchecker-plugin/pom.xml new file mode 100644 index 0000000000..cbe16b0a14 --- /dev/null +++ b/static-analysis/my-bugchecker-plugin/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.baeldung + static-analysis + 1.0-SNAPSHOT + + jar + my-bugchecker-plugin + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + + com.google.auto.service + auto-service + ${google-auto-service.version} + + + + + + + + + com.google.errorprone + error_prone_annotation + ${error-prone.version} + + + com.google.errorprone + error_prone_check_api + ${error-prone.version} + + + com.google.auto.service + auto-service-annotations + ${google-auto-service.version} + + + + + 17 + 17 + UTF-8 + + + diff --git a/static-analysis/my-bugchecker-plugin/src/main/java/com/baeldung/EmptyMethodChecker.java b/static-analysis/my-bugchecker-plugin/src/main/java/com/baeldung/EmptyMethodChecker.java new file mode 100644 index 0000000000..f31913c086 --- /dev/null +++ b/static-analysis/my-bugchecker-plugin/src/main/java/com/baeldung/EmptyMethodChecker.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import com.google.auto.service.AutoService; +import com.google.errorprone.BugPattern; +import com.google.errorprone.VisitorState; +import com.google.errorprone.bugpatterns.BugChecker; +import com.google.errorprone.fixes.SuggestedFix; +import com.google.errorprone.matchers.Description; +import com.sun.source.tree.MethodTree; + + +@AutoService(BugChecker.class) +@BugPattern(name = "EmptyMethodCheck", summary = "Empty methods should be deleted", severity = BugPattern.SeverityLevel.ERROR) +public class EmptyMethodChecker extends BugChecker implements BugChecker.MethodTreeMatcher { + @Override + public Description matchMethod(MethodTree methodTree, VisitorState visitorState) { + if (methodTree.getBody() + .getStatements() + .isEmpty()) { + return describeMatch(methodTree, SuggestedFix.delete(methodTree)); + } + return Description.NO_MATCH; + } +} diff --git a/static-analysis/pmd/pom.xml b/static-analysis/pmd/pom.xml new file mode 100644 index 0000000000..31914fe9f0 --- /dev/null +++ b/static-analysis/pmd/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.baeldung + static-analysis + 1.0-SNAPSHOT + + + pmd + + + 17 + 17 + UTF-8 + + + diff --git a/static-analysis/src/main/java/com/baeldung/pmd/Cnt.java b/static-analysis/pmd/src/main/java/com/baeldung/pmd/Cnt.java similarity index 100% rename from static-analysis/src/main/java/com/baeldung/pmd/Cnt.java rename to static-analysis/pmd/src/main/java/com/baeldung/pmd/Cnt.java diff --git a/static-analysis/src/main/resources/customruleset.xml b/static-analysis/pmd/src/main/resources/customruleset.xml similarity index 96% rename from static-analysis/src/main/resources/customruleset.xml rename to static-analysis/pmd/src/main/resources/customruleset.xml index e0a009dd4a..6b1a80334d 100644 --- a/static-analysis/src/main/resources/customruleset.xml +++ b/static-analysis/pmd/src/main/resources/customruleset.xml @@ -1,37 +1,37 @@ - - - - - This ruleset checks my code for bad stuff - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - + + + + + This ruleset checks my code for bad stuff + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static-analysis/src/main/resources/logback.xml b/static-analysis/pmd/src/main/resources/logback.xml similarity index 100% rename from static-analysis/src/main/resources/logback.xml rename to static-analysis/pmd/src/main/resources/logback.xml diff --git a/static-analysis/src/test/java/com/baeldung/pmd/CntUnitTest.java b/static-analysis/pmd/src/test/java/com/baeldung/pmd/CntUnitTest.java similarity index 100% rename from static-analysis/src/test/java/com/baeldung/pmd/CntUnitTest.java rename to static-analysis/pmd/src/test/java/com/baeldung/pmd/CntUnitTest.java diff --git a/static-analysis/pom.xml b/static-analysis/pom.xml index eedf5ba724..176f3dc092 100644 --- a/static-analysis/pom.xml +++ b/static-analysis/pom.xml @@ -6,6 +6,7 @@ static-analysis 1.0-SNAPSHOT static-analysis + pom com.baeldung @@ -29,4 +30,15 @@ - \ No newline at end of file + + pmd + my-bugchecker-plugin + error-prone-project + + + + 2.23.0 + 1.0.1 + + + From b80ceb7cebf411c797015023b37e6815bfda520a Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:45:14 +0200 Subject: [PATCH 680/831] This PR is related to BAEL-7188 (#15271) * Update pom.xml Adding core-java-swing * This commit is related to BAEL-7188 This commit aims to add a new module named "core-java-swing". --- core-java-modules/core-java-swing/pom.xml | 21 +++++++ .../com/baeldung/customfont/CustomFonts.java | 55 ++++++++++++++++++ .../target/classes/org/example/Main.class | Bin 0 -> 2912 bytes core-java-modules/pom.xml | 1 + 4 files changed, 77 insertions(+) create mode 100644 core-java-modules/core-java-swing/pom.xml create mode 100644 core-java-modules/core-java-swing/src/main/java/com/baeldung/customfont/CustomFonts.java create mode 100644 core-java-modules/core-java-swing/target/classes/org/example/Main.class diff --git a/core-java-modules/core-java-swing/pom.xml b/core-java-modules/core-java-swing/pom.xml new file mode 100644 index 0000000000..28228ebb29 --- /dev/null +++ b/core-java-modules/core-java-swing/pom.xml @@ -0,0 +1,21 @@ + + + 4.0.0 + core-java-string-swing + core-java-string-swing + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + 20 + 20 + UTF-8 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-swing/src/main/java/com/baeldung/customfont/CustomFonts.java b/core-java-modules/core-java-swing/src/main/java/com/baeldung/customfont/CustomFonts.java new file mode 100644 index 0000000000..28e0da84ae --- /dev/null +++ b/core-java-modules/core-java-swing/src/main/java/com/baeldung/customfont/CustomFonts.java @@ -0,0 +1,55 @@ +package com.baeldung.customfont; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +public class CustomFonts { + public static void main(String[] args) { + usingCustomFonts(); + } + + public static void usingCustomFonts() { + final GraphicsEnvironment GE = GraphicsEnvironment.getLocalGraphicsEnvironment(); + final List AVAILABLE_FONT_FAMILY_NAMES = Arrays.asList(GE.getAvailableFontFamilyNames()); + try { + final List LIST = Arrays.asList( + new File("font/JetBrainsMono/JetBrainsMono-Thin.ttf"), + new File("font/JetBrainsMono/JetBrainsMono-Light.ttf"), + new File("font/Roboto/Roboto-Light.ttf"), + new File("font/Roboto/Roboto-Regular.ttf"), + new File("font/Roboto/Roboto-Medium.ttf") + ); + for (File LIST_ITEM : LIST) { + if (LIST_ITEM.exists()) { + Font FONT = Font.createFont(Font.TRUETYPE_FONT, LIST_ITEM); + if (!AVAILABLE_FONT_FAMILY_NAMES.contains(FONT.getFontName())) { + GE.registerFont(FONT); + } + } + } + } catch (FontFormatException | IOException exception) { + JOptionPane.showMessageDialog(null, exception.getMessage()); + } + + + JFrame frame = new JFrame("Custom Font Example"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setLayout(new FlowLayout()); + + JLabel label1 = new JLabel("TEXT1"); + label1.setFont(new Font("Roboto Medium", Font.PLAIN, 17)); + + JLabel label2 = new JLabel("TEXT2"); + label2.setFont(new Font("JetBrainsMono-Thin", Font.PLAIN, 17)); + + frame.add(label1); + frame.add(label2); + + frame.pack(); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-swing/target/classes/org/example/Main.class b/core-java-modules/core-java-swing/target/classes/org/example/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..5914458bc4b1b959f8d4cc18270605acd2f4249e GIT binary patch literal 2912 zcmai0+jA3D82@dXWYe$+6hSHlQxI)RN(2FwVzrb614)at7F#cMn{JbZBpY`(wDo?! z-|yi4ikBH@d`ZEMjx#GmpU?u?9t5JZcLkcMSa+_JMV zV@5BO@ETC z^;yGBSs6XQBsbg{N&T08k8rkH!^K$Rnd&>Cn|XaAZzQauo6rkpes(}F7>1Uj3x)`j1X?Yh>D{cZWZV7L}V80BFqa(sti0-Ol zp>8~3Gq*uZFv$M0<64EVIA=KSO{5UU(IFm&hAGh3I>&JL8&i5Y@Al^{#~3ULATkvM zO=mJf4`%JSGLw00I;GEAWdb6HW??C>p#X}v(2~dEz-c&vx0lw7OpDzkES4^eIi*h+ z`5=gX|8V@)VGc?Q9YK@{La!miUMmSGO^XRI!;~&D0g?<@=-#8@UfjoqU`YRl1`dk{ zs{VEa@eo5=G=t>S5yyK(!=reNEu~LRa=0`cY@sv_qj+IcC_ka$NpUIoN_ytF*mzpQ zGkBIzVPqqwV{#sgM2|&A`0BSNxmuAji^f2?Fk#rkVqP;cc@2!{wkg)tO`n@H*%#zp zaNqRMQbFE3YZuMsYJW*jx}Bx&>c+8MWm7pZI4~^2Sk(Wt+LB5R4UZ>><7rN?#XV0g z!Q?gJ?bk<}P%~=X#V&3DalLUU({v!tF}vV#i7Ss%>-$FflBvFZsra~vaXitNPNqi3 z2l~=+wyl3kAfHo3npxZrR1Wa+GxFR2!I#*p^LKCnFV6OCsh08Z1!vpqt!s0ymqspM zTBPw_6=KVWT;d_Em#Vc44OwM7V~9JE`4S%u+eGrw!B2}Oev|;s-~kcf^Es|!d@FqW zyXK&LL!t@K^C{Rs2ruxdc>;J5FLBj^m+=aBgz^slg`DpU)CFDf(Id2)IZ+q%eRvhG zalb`;+j#m-QBnb#2%Ld-sH=k3GfY|VJG75B&-2l`aSq|3QJ_3Z}ns5rC zF0o1-J$?SC)6mjNw1VL?7@f!XXsbSlOgb8Nc-jHHQ-w%u3GvC}#=v4OP-Q+G49JMbnp;eA|zFK{KkMkmgq3qN8jenB_R zVHcore-java-string-algorithms core-java-string-algorithms-2 core-java-string-apis + core-java-swing core-java-string-apis-2 core-java-string-conversions core-java-string-conversions-2 From 783d9dbd0189b6f427190b28db22e5ebe5b123bb Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:01:28 +0100 Subject: [PATCH 681/831] Use slf4j --- .../com/baeldung/timefoldsolver/ShiftScheduleApp.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 9c25922dea..9170e2363f 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -8,9 +8,13 @@ import java.util.Set; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ShiftScheduleApp { + private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); + public static void main(String[] args) { SolverFactory solverFactory = SolverFactory.create(new SolverConfig() .withSolutionClass(ShiftSchedule.class) @@ -43,9 +47,9 @@ public class ShiftScheduleApp { } private static void printSolution(ShiftSchedule solution) { - System.out.println("Shift assignments"); + logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { - System.out.println(" " + shift.getStart().toLocalDate() + logger.info(" " + shift.getStart().toLocalDate() + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() + ": " + shift.getEmployee().getName()); } From 3df51484f27a8ee07507d827df34f17c8e80af6f Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:17:46 +0100 Subject: [PATCH 682/831] improve comment --- .../timefoldsolver/ShiftScheduleConstraintProviderTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index 9979f5d5e0..9477e892eb 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -22,7 +22,8 @@ class ShiftScheduleConstraintProviderTest { ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) - // Penalizes both A-B and B-A. To avoid that, use forEachUniquePair() in the constraint instead. + // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. + // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given( From 07a6999e56bd27aa2d0fc6b1b779245c814663a6 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:40:29 +0100 Subject: [PATCH 683/831] format with baeldung style --- .../com/baeldung/timefoldsolver/Shift.java | 3 +- .../timefoldsolver/ShiftScheduleApp.java | 42 +++++++++---------- .../ShiftScheduleConstraintProvider.java | 28 ++++++------- .../ShiftScheduleConstraintProviderTest.java | 37 +++++++--------- 4 files changed, 48 insertions(+), 62 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java index 9c7b663ecd..2ef2f2a1b9 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/Shift.java @@ -16,7 +16,8 @@ public class Shift { private Employee employee; // A no-arg constructor is required for @PlanningEntity annotated classes - public Shift() {} + public Shift() { + } public Shift(LocalDateTime start, LocalDateTime end, String requiredSkill) { this(start, end, requiredSkill, null); diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 9170e2363f..24666ac6aa 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -5,24 +5,24 @@ import java.time.LocalDate; import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ShiftScheduleApp { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); public static void main(String[] args) { - SolverFactory solverFactory = SolverFactory.create(new SolverConfig() - .withSolutionClass(ShiftSchedule.class) - .withEntityClasses(Shift.class) - .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 5 seconds on this small dataset. - // It's recommended to run for at least 5 minutes ("5m") otherwise. - .withTerminationSpentLimit(Duration.ofSeconds(5))); + SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) + .withEntityClasses(Shift.class) + .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) + // The solver runs only for 5 seconds on this small dataset. + // It's recommended to run for at least 5 minutes ("5m") otherwise. + .withTerminationSpentLimit(Duration.ofSeconds(5))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); @@ -33,25 +33,21 @@ public class ShiftScheduleApp { private static ShiftSchedule loadProblem() { LocalDate monday = LocalDate.of(2030, 4, 1); LocalDate tuesday = LocalDate.of(2030, 4, 2); - return new ShiftSchedule(List.of( - new Employee("Ann", Set.of("Bartender")), - new Employee("Beth", Set.of("Waiter", "Bartender")), - new Employee("Carl", Set.of("Waiter")) - ), List.of( - new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), - new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), - new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), - new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), - new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender") - )); + return new ShiftSchedule( + List.of(new Employee("Ann", Set.of("Bartender")), new Employee("Beth", Set.of("Waiter", "Bartender")), new Employee("Carl", Set.of("Waiter"))), + List.of(new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"), + new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"), + new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender"))); } private static void printSolution(ShiftSchedule solution) { logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { - logger.info(" " + shift.getStart().toLocalDate() - + " " + shift.getStart().toLocalTime() + " - " + shift.getEnd().toLocalTime() - + ": " + shift.getEmployee().getName()); + logger.info(" " + shift.getStart() + .toLocalDate() + " " + shift.getStart() + .toLocalTime() + " - " + shift.getEnd() + .toLocalTime() + ": " + shift.getEmployee() + .getName()); } } diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java index 0846429460..bd308dacbf 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProvider.java @@ -1,37 +1,35 @@ package com.baeldung.timefoldsolver; +import static ai.timefold.solver.core.api.score.stream.Joiners.equal; + import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; import ai.timefold.solver.core.api.score.stream.Constraint; import ai.timefold.solver.core.api.score.stream.ConstraintFactory; import ai.timefold.solver.core.api.score.stream.ConstraintProvider; -import static ai.timefold.solver.core.api.score.stream.Joiners.equal; - public class ShiftScheduleConstraintProvider implements ConstraintProvider { @Override public Constraint[] defineConstraints(ConstraintFactory constraintFactory) { - return new Constraint[] { - atMostOneShiftPerDay(constraintFactory), - requiredSkill(constraintFactory) - }; + return new Constraint[] { atMostOneShiftPerDay(constraintFactory), requiredSkill(constraintFactory) }; } public Constraint atMostOneShiftPerDay(ConstraintFactory constraintFactory) { return constraintFactory.forEach(Shift.class) - .join(Shift.class, - equal(shift -> shift.getStart().toLocalDate()), - equal(Shift::getEmployee)) - .filter((shift1, shift2) -> shift1 != shift2) - .penalize(HardSoftScore.ONE_HARD) - .asConstraint("At most one shift per day"); + .join(Shift.class, equal(shift -> shift.getStart() + .toLocalDate()), equal(Shift::getEmployee)) + .filter((shift1, shift2) -> shift1 != shift2) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("At most one shift per day"); } public Constraint requiredSkill(ConstraintFactory constraintFactory) { return constraintFactory.forEach(Shift.class) - .filter(shift -> !shift.getEmployee().getSkills().contains(shift.getRequiredSkill())) - .penalize(HardSoftScore.ONE_HARD) - .asConstraint("Required skill"); + .filter(shift -> !shift.getEmployee() + .getSkills() + .contains(shift.getRequiredSkill())) + .penalize(HardSoftScore.ONE_HARD) + .asConstraint("Required skill"); } } diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index 9477e892eb..c4741a831b 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -3,49 +3,40 @@ package com.baeldung.timefoldsolver; import java.time.LocalDate; import java.util.Set; -import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; import org.junit.jupiter.api.Test; +import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; + class ShiftScheduleConstraintProviderTest { private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); - ConstraintVerifier constraintVerifier = ConstraintVerifier.build( - new ShiftScheduleConstraintProvider(), ShiftSchedule.class, Shift.class); + ConstraintVerifier constraintVerifier = ConstraintVerifier.build(new ShiftScheduleConstraintProvider(), + ShiftSchedule.class, Shift.class); @Test void atMostOneShiftPerDay() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), - new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) - // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead. - .penalizesBy(2); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) + // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. + // To avoid that, use forEachUniquePair() in the constraint instead. + .penalizesBy(2); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), - new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) - .penalizesBy(0); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) + .penalizesBy(0); } @Test void requiredSkill() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) - .penalizesBy(1); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) + .penalizesBy(1); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) - .given( - ann, - new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) - .penalizesBy(0); + .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) + .penalizesBy(0); } } From dfd736183f64d84efdd29ecbbc5f1795cb21ca75 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Fri, 24 Nov 2023 21:44:10 +0100 Subject: [PATCH 684/831] Adjust test names --- .../ShiftScheduleConstraintProviderTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java index c4741a831b..0832cd7bdd 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java @@ -16,24 +16,33 @@ class ShiftScheduleConstraintProviderTest { ShiftSchedule.class, Shift.class); @Test - void atMostOneShiftPerDay() { + void whenTwoShiftsOnOneDay_thenPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); + } + @Test + void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { + Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) .penalizesBy(0); } @Test - void requiredSkill() { + void whenEmployeeLacksRequiredSkill_thenPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) .penalizesBy(1); + } + + @Test + void whenEmployeeHasRequiredSkill_thenDoNotPenalize() { + Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) .penalizesBy(0); From f4c35c055c48de3e15892bb10237f9cc827f27b7 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Fri, 24 Nov 2023 21:17:18 +0000 Subject: [PATCH 685/831] BAEL-7218: Inter-Process Communication Methods in Java (#15286) --- core-java-modules/core-java-ipc/pom.xml | 16 ++++++ .../com/baeldung/ipc/DirectoryLiveTest.java | 32 ++++++++++++ .../java/com/baeldung/ipc/JmxLiveTest.java | 52 +++++++++++++++++++ .../com/baeldung/ipc/SocketsLiveTest.java | 38 ++++++++++++++ core-java-modules/pom.xml | 1 + 5 files changed, 139 insertions(+) create mode 100644 core-java-modules/core-java-ipc/pom.xml create mode 100644 core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/DirectoryLiveTest.java create mode 100644 core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/JmxLiveTest.java create mode 100644 core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/SocketsLiveTest.java diff --git a/core-java-modules/core-java-ipc/pom.xml b/core-java-modules/core-java-ipc/pom.xml new file mode 100644 index 0000000000..b7b37afb1d --- /dev/null +++ b/core-java-modules/core-java-ipc/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + core-java-ipc + core-java-ipc + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + diff --git a/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/DirectoryLiveTest.java b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/DirectoryLiveTest.java new file mode 100644 index 0000000000..ca7b6d2a0e --- /dev/null +++ b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/DirectoryLiveTest.java @@ -0,0 +1,32 @@ +package com.baeldung.ipc; + +import org.junit.jupiter.api.Test; + +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardWatchEventKinds; +import java.nio.file.WatchKey; +import java.nio.file.WatchEvent; +import java.nio.file.WatchService; + + +public class DirectoryLiveTest { + @Test + public void consumer() throws Exception { + WatchService watchService = FileSystems.getDefault().newWatchService(); + // Set this to an appropriate directory. + Path path = Paths.get("/tmp/ipc"); + + path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE); + + WatchKey key; + while ((key = watchService.take()) != null) { + for (WatchEvent event : key.pollEvents()) { + // React to new file. + System.out.println(event); + } + key.reset(); + } + } +} diff --git a/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/JmxLiveTest.java b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/JmxLiveTest.java new file mode 100644 index 0000000000..8ac16fdfc3 --- /dev/null +++ b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/JmxLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.ipc; + +import org.junit.jupiter.api.Test; + +import javax.management.JMX; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; +import java.lang.management.ManagementFactory; +import java.util.concurrent.TimeUnit; + +public class JmxLiveTest { + /* + * This test needs to be run with the following system properties defined: + * -Dcom.sun.management.jmxremote=true + * -Dcom.sun.management.jmxremote.port=1234 + * -Dcom.sun.management.jmxremote.authenticate=false + * -Dcom.sun.management.jmxremote.ssl=false + */ + @Test + public void consumer() throws Exception { + ObjectName objectName = new ObjectName("com.baeldung.ipc:type=basic,name=test"); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + server.registerMBean(new IPCTest(), objectName); + + TimeUnit.MINUTES.sleep(50); + } + + @Test + public void producer() throws Exception { + JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi"); + try (JMXConnector jmxc = JMXConnectorFactory.connect(url, null)) { + ObjectName objectName = new ObjectName("com.baeldung.ipc:type=basic,name=test"); + + IPCTestMBean mbeanProxy = JMX.newMBeanProxy(jmxc.getMBeanServerConnection(), objectName, IPCTestMBean.class, true); + mbeanProxy.sendMessage("Hello"); + } + } + + public interface IPCTestMBean { + void sendMessage(String message); + } + + class IPCTest implements IPCTestMBean { + @Override + public void sendMessage(String message) { + System.out.println("Received message: " + message); + } + } +} diff --git a/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/SocketsLiveTest.java b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/SocketsLiveTest.java new file mode 100644 index 0000000000..9b006c110e --- /dev/null +++ b/core-java-modules/core-java-ipc/src/test/java/com/baeldung/ipc/SocketsLiveTest.java @@ -0,0 +1,38 @@ +package com.baeldung.ipc; + +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class SocketsLiveTest { + @Test + public void consumer() throws Exception { + try (ServerSocket serverSocket = new ServerSocket(1234)) { + Socket clientSocket = serverSocket.accept(); + + PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + + String line; + while ((line = in.readLine()) != null) { + System.out.println("Received message: " + line); + } + } + } + + @Test + public void producer() throws Exception { + try (Socket clientSocket = new Socket("localhost", 1234)) { + PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); + BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + + out.println("Hello"); + + String response = in.readLine(); + } + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 9343343b6e..b3ef8167a5 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -54,6 +54,7 @@ core-java-concurrency-simple core-java-datetime-string core-java-io-conversions-2 + core-java-ipc core-java-jpms core-java-lang-oop-constructors-2 core-java-methods From fa272d33953eb2b765be896acba462a5f2a28650 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sat, 25 Nov 2023 05:25:47 +0000 Subject: [PATCH 686/831] Retrieving Unix Time in Java --- .../baeldung/unixtime/UnixTimeUnitTest.java | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java index d1518ceef5..eedd897e91 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/unixtime/UnixTimeUnitTest.java @@ -1,50 +1,42 @@ package com.baeldung.unixtime; - import static org.junit.Assert.assertEquals; - import java.time.Instant; +import java.time.LocalDate; + +import java.time.Month; +import java.time.ZoneId; import java.util.Date; import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; + import org.junit.jupiter.api.Test; public class UnixTimeUnitTest { @Test - public void givenCurrentTimeUsingDateApi_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - Date date = new Date(); - long longTime = date.getTime() / 1000L; - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingDateApi_whenConvertedToUnixTime_thenMatch() { + Date date = new Date(2023 - 1900, 1, 15, 0, 0, 0); + long expected = 1676419200; + long actual = date.getTime() / 1000L; + assertEquals(expected, actual); } @Test - public void givenCurrentTimeUsingInstantNow_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - long longTime = Instant.now().getEpochSecond(); - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingJodaTime_whenConvertedToUnixTime_thenMatch() { + DateTime dateTime = new DateTime(2023, 2, 15, 00, 00, 00, 0); + long expected = 1676419200; + long actual = dateTime.getMillis() / 1000L; + assertEquals(expected, actual); } @Test - public void givenCurrentTimeUsingJodaTime_whenConvertedToUnixTime_thenConsistent() { - long marginOfError = 1L; - DateTime dateTime = DateTime.now(DateTimeZone.UTC); - long longTime = dateTime.getMillis() / 1000L; - - for (int i = 0; i < 10; i++) { - long unixTime = System.currentTimeMillis() / 1000L; - assertEquals(longTime, unixTime, marginOfError); - } + public void givenTimeUsingLocalDate_whenConvertedToUnixTime_thenMatch() { + LocalDate date = LocalDate.of(2023, Month.FEBRUARY, 15); + Instant instant = date.atStartOfDay().atZone(ZoneId.of("UTC")).toInstant(); + long expected = 1676419200; + long actual = instant.getEpochSecond(); + assertEquals(expected, actual); } } From 41979445efc0c426dbeb6dbcf86c52d3693de040 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 25 Nov 2023 12:03:07 +0200 Subject: [PATCH 687/831] Java 26374 Identify and move popular Boot articles (#15139) --- .../spring-data-jpa-repo-2/README.md | 2 -- .../spring-data-jpa-repo-2/pom.xml | 5 ----- .../data/persistence/repository/IFooService.java | 5 ----- .../src/test/resources/test-movie-cleanup.sql | 1 - .../src/test/resources/test-movie-data.sql | 7 ------- .../spring-data-jpa-repo/README.md | 3 +++ persistence-modules/spring-data-jpa-repo/pom.xml | 5 +++++ .../main/java/com/baeldung}/repository/Foo.java | 9 +++++++-- .../com/baeldung}/repository/FooService.java | 2 +- .../java/com/baeldung}/repository/IFooDAO.java | 3 ++- .../com/baeldung/repository/IFooService.java | 5 +++++ .../baeldung}/repository/PersistenceConfig.java | 14 ++++++++------ .../data/persistence/like/LikeApplication.java | 0 .../data/persistence/like/model/Movie.java | 0 .../like/repository/MovieRepository.java | 5 +++-- .../src/main/resources/persistence.properties | 9 +++++++++ .../src/main/resources/springDataConfig.xml | 2 +- .../repository/FooServiceIntegrationTest.java | 6 +++--- .../like/MovieRepositoryIntegrationTest.java | 16 +++++++++------- .../test/resources/application-test.properties | 4 ++-- .../src/test/resources/test-movie-cleanup.sql | 1 + .../src/test/resources/test-movie-data.sql | 7 +++++++ 22 files changed, 66 insertions(+), 45 deletions(-) delete mode 100644 persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooService.java delete mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-cleanup.sql delete mode 100644 persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-data.sql rename persistence-modules/{spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence => spring-data-jpa-repo/src/main/java/com/baeldung}/repository/Foo.java (87%) rename persistence-modules/{spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence => spring-data-jpa-repo/src/main/java/com/baeldung}/repository/FooService.java (83%) rename persistence-modules/{spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence => spring-data-jpa-repo/src/main/java/com/baeldung}/repository/IFooDAO.java (82%) create mode 100644 persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java rename persistence-modules/{spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence => spring-data-jpa-repo/src/main/java/com/baeldung}/repository/PersistenceConfig.java (93%) rename persistence-modules/{spring-data-jpa-repo-2 => spring-data-jpa-repo}/src/main/java/com/baeldung/spring/data/persistence/like/LikeApplication.java (100%) rename persistence-modules/{spring-data-jpa-repo-2 => spring-data-jpa-repo}/src/main/java/com/baeldung/spring/data/persistence/like/model/Movie.java (100%) rename persistence-modules/{spring-data-jpa-repo-2 => spring-data-jpa-repo}/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java (99%) create mode 100644 persistence-modules/spring-data-jpa-repo/src/main/resources/persistence.properties rename persistence-modules/{spring-data-jpa-repo-2 => spring-data-jpa-repo}/src/main/resources/springDataConfig.xml (83%) rename persistence-modules/{spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence => spring-data-jpa-repo/src/test/java/com/baeldung}/repository/FooServiceIntegrationTest.java (92%) rename persistence-modules/{spring-data-jpa-repo-2 => spring-data-jpa-repo}/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java (99%) create mode 100644 persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-cleanup.sql create mode 100644 persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-data.sql diff --git a/persistence-modules/spring-data-jpa-repo-2/README.md b/persistence-modules/spring-data-jpa-repo-2/README.md index 23134ec02d..8c588405f7 100644 --- a/persistence-modules/spring-data-jpa-repo-2/README.md +++ b/persistence-modules/spring-data-jpa-repo-2/README.md @@ -2,9 +2,7 @@ ### Relevant Articles: -- [Introduction to Spring Data JPA](https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa) - [Performance Difference Between save() and saveAll() in Spring Data](https://www.baeldung.com/spring-data-save-saveall) -- [LIKE Queries in Spring JPA Repositories](https://www.baeldung.com/spring-jpa-like-queries) - [How to Access EntityManager with Spring Data](https://www.baeldung.com/spring-data-entitymanager) - [Difference Between JPA and Spring Data JPA](https://www.baeldung.com/spring-data-jpa-vs-jpa) - [Differences Between Spring Data JPA findFirst() and findTop()](https://www.baeldung.com/spring-data-jpa-findfirst-vs-findtop) diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml index 8186a0f7a5..e39458449c 100644 --- a/persistence-modules/spring-data-jpa-repo-2/pom.xml +++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml @@ -42,11 +42,6 @@ com.querydsl querydsl-jpa - - com.google.guava - guava - ${guava.version} - diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooService.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooService.java deleted file mode 100644 index 8ce6a2d1ae..0000000000 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooService.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.spring.data.persistence.repository; - -public interface IFooService { - Foo create(Foo foo); -} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-cleanup.sql b/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-cleanup.sql deleted file mode 100644 index 0ba0ba0694..0000000000 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-cleanup.sql +++ /dev/null @@ -1 +0,0 @@ -DELETE FROM "movie"; \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-data.sql b/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-data.sql deleted file mode 100644 index 0eb9638f43..0000000000 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/resources/test-movie-data.sql +++ /dev/null @@ -1,7 +0,0 @@ -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(1, 'Godzilla: King of the Monsters', ' Michael Dougherty', 'PG-13', 132); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(4, 'Dumbo', 'Tim Burton', 'PG', 112); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(5, 'Booksmart', 'Olivia Wilde', 'R', 102); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(6, 'Aladdin', 'Guy Ritchie', 'PG', 128); -INSERT INTO "movie" ("id", "title", "director", "rating", "duration") VALUES(7, 'The Sun Is Also a Star', 'Ry Russo-Young', 'PG-13', 100); diff --git a/persistence-modules/spring-data-jpa-repo/README.md b/persistence-modules/spring-data-jpa-repo/README.md index 43097a8c1e..9587f544f9 100644 --- a/persistence-modules/spring-data-jpa-repo/README.md +++ b/persistence-modules/spring-data-jpa-repo/README.md @@ -3,6 +3,7 @@ This module contains articles about repositories in Spring Data JPA ### Relevant Articles: +- [Introduction to Spring Data JPA](https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa) - [Case Insensitive Queries with Spring Data Repository](https://www.baeldung.com/spring-data-case-insensitive-queries) - [Derived Query Methods in Spring Data JPA Repositories](https://www.baeldung.com/spring-data-derived-queries) - [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save) @@ -10,6 +11,8 @@ This module contains articles about repositories in Spring Data JPA - [Spring Data Composable Repositories](https://www.baeldung.com/spring-data-composable-repositories) - [Spring Data JPA Repository Populators](https://www.baeldung.com/spring-data-jpa-repository-populators) - [Calling Stored Procedures from Spring Data JPA Repositories](https://www.baeldung.com/spring-data-jpa-stored-procedures) +- [LIKE Queries in Spring JPA Repositories](https://www.baeldung.com/spring-jpa-like-queries) + - More articles: [[--> next]](../spring-data-jpa-repo-2) ### Eclipse Config diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml index 26fff365a1..2b2bf33d7f 100644 --- a/persistence-modules/spring-data-jpa-repo/pom.xml +++ b/persistence-modules/spring-data-jpa-repo/pom.xml @@ -42,6 +42,11 @@ org.springframework spring-oxm + + com.google.guava + guava + ${guava.version} + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/Foo.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java similarity index 87% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/Foo.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java index 6833c4c556..27ebcf5875 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/Foo.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/Foo.java @@ -1,8 +1,13 @@ -package com.baeldung.spring.data.persistence.repository; +package com.baeldung.repository; -import javax.persistence.*; import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + @Entity public class Foo implements Serializable { @Id diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/FooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java similarity index 83% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/FooService.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java index cb09a92b82..98084240ac 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/FooService.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/FooService.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.data.persistence.repository; +package com.baeldung.repository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDAO.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java similarity index 82% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDAO.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java index 20a81e7bfa..6ee74fe26c 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/IFooDAO.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooDAO.java @@ -1,8 +1,9 @@ -package com.baeldung.spring.data.persistence.repository; +package com.baeldung.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; public interface IFooDAO extends JpaRepository { diff --git a/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java new file mode 100644 index 0000000000..6c4d36710c --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/IFooService.java @@ -0,0 +1,5 @@ +package com.baeldung.repository; + +public interface IFooService { + Foo create(Foo foo); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/PersistenceConfig.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java similarity index 93% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/PersistenceConfig.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java index f73ea94658..f3c9301bcf 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/repository/PersistenceConfig.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/repository/PersistenceConfig.java @@ -1,6 +1,9 @@ -package com.baeldung.spring.data.persistence.repository; +package com.baeldung.repository; + +import java.util.Properties; + +import javax.sql.DataSource; -import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -16,15 +19,14 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.sql.DataSource; -import java.util.Properties; +import com.google.common.base.Preconditions; @Configuration @PropertySource("classpath:persistence.properties") -@ComponentScan("com.baeldung.spring.data.persistence.repository") +@ComponentScan("com.baeldung.repository") //@ImportResource("classpath*:*springDataConfig.xml") @EnableTransactionManagement -@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.repository") +@EnableJpaRepositories(basePackages = "com.baeldung.repository") public class PersistenceConfig { @Autowired diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/LikeApplication.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/LikeApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/LikeApplication.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/LikeApplication.java diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/model/Movie.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/model/Movie.java similarity index 100% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/model/Movie.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/model/Movie.java diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java similarity index 99% rename from persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java rename to persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java index 57befb5943..06e75222a3 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java +++ b/persistence-modules/spring-data-jpa-repo/src/main/java/com/baeldung/spring/data/persistence/like/repository/MovieRepository.java @@ -1,11 +1,12 @@ package com.baeldung.spring.data.persistence.like.repository; -import com.baeldung.spring.data.persistence.like.model.Movie; +import java.util.List; + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -import java.util.List; +import com.baeldung.spring.data.persistence.like.model.Movie; public interface MovieRepository extends CrudRepository { diff --git a/persistence-modules/spring-data-jpa-repo/src/main/resources/persistence.properties b/persistence-modules/spring-data-jpa-repo/src/main/resources/persistence.properties new file mode 100644 index 0000000000..05cb7a13b9 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/persistence.properties @@ -0,0 +1,9 @@ +# jdbc.X +jdbc.driverClassName=org.h2.Driver +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.user=sa +jdbc.pass=sa + +# hibernate.X +hibernate.hbm2ddl.auto=create-drop +hibernate.dialect=org.hibernate.dialect.H2Dialect diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/springDataConfig.xml b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml similarity index 83% rename from persistence-modules/spring-data-jpa-repo-2/src/main/resources/springDataConfig.xml rename to persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml index b2616d9eae..e581d514a4 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/resources/springDataConfig.xml +++ b/persistence-modules/spring-data-jpa-repo/src/main/resources/springDataConfig.xml @@ -7,5 +7,5 @@ http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" > - + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/repository/FooServiceIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java similarity index 92% rename from persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/repository/FooServiceIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java index 21990afb5e..9362b4c338 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/repository/FooServiceIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/repository/FooServiceIntegrationTest.java @@ -1,4 +1,6 @@ -package com.baeldung.spring.data.persistence.repository; +package com.baeldung.repository; + +import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,8 +9,6 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; -import javax.sql.DataSource; - @RunWith(SpringRunner.class) @ContextConfiguration(classes = PersistenceConfig.class) public class FooServiceIntegrationTest { diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java rename to persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java index 291926c127..dcb87a26a6 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo/src/test/java/com/baeldung/spring/data/persistence/like/MovieRepositoryIntegrationTest.java @@ -1,7 +1,12 @@ package com.baeldung.spring.data.persistence.like; -import com.baeldung.spring.data.persistence.like.model.Movie; -import com.baeldung.spring.data.persistence.like.repository.MovieRepository; +import static org.junit.Assert.assertEquals; +import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD; + +import java.util.List; + +import javax.sql.DataSource; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -9,11 +14,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.junit4.SpringRunner; -import javax.sql.DataSource; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD; +import com.baeldung.spring.data.persistence.like.model.Movie; +import com.baeldung.spring.data.persistence.like.repository.MovieRepository; @RunWith(SpringRunner.class) @Sql(scripts = { "/test-movie-data.sql" }) diff --git a/persistence-modules/spring-data-jpa-repo/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-repo/src/test/resources/application-test.properties index f9497c8f37..6f93e7d79d 100644 --- a/persistence-modules/spring-data-jpa-repo/src/test/resources/application-test.properties +++ b/persistence-modules/spring-data-jpa-repo/src/test/resources/application-test.properties @@ -1,2 +1,2 @@ -spring.jpa.hibernate.ddl-auto=update -spring.datasource.url=jdbc:h2:mem:jpa3 \ No newline at end of file +#spring.jpa.hibernate.ddl-auto=update +#spring.datasource.url=jdbc:h2:mem:jpa3 \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-cleanup.sql b/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-cleanup.sql new file mode 100644 index 0000000000..e2e70a6a74 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-cleanup.sql @@ -0,0 +1 @@ +DELETE FROM movie; \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-data.sql b/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-data.sql new file mode 100644 index 0000000000..3b706f14e3 --- /dev/null +++ b/persistence-modules/spring-data-jpa-repo/src/test/resources/test-movie-data.sql @@ -0,0 +1,7 @@ +INSERT INTO movie(id,title,director,rating,duration) VALUES(1, 'Godzilla: King of the Monsters', ' Michael Dougherty', 'PG-13', 132); +INSERT INTO movie(id,title,director,rating,duration) VALUES(2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181); +INSERT INTO movie(id,title,director,rating,duration) VALUES(3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123); +INSERT INTO movie(id,title,director,rating,duration) VALUES(4, 'Dumbo', 'Tim Burton', 'PG', 112); +INSERT INTO movie(id,title,director,rating,duration) VALUES(5, 'Booksmart', 'Olivia Wilde', 'R', 102); +INSERT INTO movie(id,title,director,rating,duration) VALUES(6, 'Aladdin', 'Guy Ritchie', 'PG', 128); +INSERT INTO movie(id,title,director,rating,duration) VALUES(7, 'The Sun Is Also a Star', 'Ry Russo-Young', 'PG-13', 100); From 7df2f25fdb836be6b6057ad824ec30931cd00179 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 25 Nov 2023 16:35:00 +0530 Subject: [PATCH 688/831] JAVA-26737 Upgarde hibernate ehcache version in spring-hibernate-5 module --- persistence-modules/spring-hibernate-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index e559fe1394..d3ba647af2 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -131,7 +131,7 @@ 1.10.6.RELEASE 4.2.1.RELEASE - 5.2.10.Final + 5.6.15.Final 5.8.2.Final 8.0.7-dmr 9.0.0.M26 From ad7f1c7486cc2948af1d09e1512737982c125038 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 25 Nov 2023 16:43:03 +0530 Subject: [PATCH 689/831] JAVA-26737 Upgrade hibernate ehcache version in hibernate-libraries module --- persistence-modules/hibernate-libraries/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml index 3f4da28296..d701487676 100644 --- a/persistence-modules/hibernate-libraries/pom.xml +++ b/persistence-modules/hibernate-libraries/pom.xml @@ -162,7 +162,7 @@ 1.6 2.9.7 - 5.4.14.Final + 5.6.15.Final 3.27.0-GA 2.3.1 2.0.0 From 6032d3691d56d5196da427b9cb29e2e1bc85e504 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 23:12:42 +0100 Subject: [PATCH 690/831] JAVA-26757: Update pdf to a new version of thymeleaf. --- pdf/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdf/pom.xml b/pdf/pom.xml index 34094481bf..041f356b9a 100644 --- a/pdf/pom.xml +++ b/pdf/pom.xml @@ -111,7 +111,7 @@ 3.15 1.8 3.15 - 3.0.11.RELEASE + 3.1.2.RELEASE 9.3.1 1.0.6 1.0.10 From 126594bacf59c11a908f8a50e04486678b784e95 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 23:25:37 +0100 Subject: [PATCH 691/831] JAVA-26757: Update spring-thymeleaf-5 to new version of thymeleaf. --- spring-web-modules/spring-thymeleaf-5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-thymeleaf-5/pom.xml b/spring-web-modules/spring-thymeleaf-5/pom.xml index 2d178bd933..e6b0511ce5 100644 --- a/spring-web-modules/spring-thymeleaf-5/pom.xml +++ b/spring-web-modules/spring-thymeleaf-5/pom.xml @@ -135,7 +135,7 @@ 2.3.2.RELEASE - 3.0.11.RELEASE + 3.1.2.RELEASE 3.0.4.RELEASE 2.4.1 2.0.1.Final From e01877df5007d449b7dc2fbd6e9844d3d39ee670 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 23:33:07 +0100 Subject: [PATCH 692/831] JAVA-26757: Update spring-mvc-basics-2 to new version of thymeleaf. --- spring-web-modules/spring-mvc-basics-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-mvc-basics-2/pom.xml b/spring-web-modules/spring-mvc-basics-2/pom.xml index 613e42dee3..32cf3c9e9f 100644 --- a/spring-web-modules/spring-mvc-basics-2/pom.xml +++ b/spring-web-modules/spring-mvc-basics-2/pom.xml @@ -150,7 +150,7 @@ 8.0.1.Final enter-location-of-server - 3.0.11.RELEASE + 3.1.2.RELEASE 2.4.12 2.3.27-incubating 1.2.5 From 36dfdf283294c3297ba9ca8377ddef33ad6d68f3 Mon Sep 17 00:00:00 2001 From: Harpal Singh Date: Thu, 23 Nov 2023 23:40:08 +0100 Subject: [PATCH 693/831] JAVA-26757: Update spring-thymeleaf to new version of thymeleaf. --- spring-web-modules/spring-thymeleaf/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-thymeleaf/pom.xml b/spring-web-modules/spring-thymeleaf/pom.xml index ce0c0a7e21..ca94d4581e 100644 --- a/spring-web-modules/spring-thymeleaf/pom.xml +++ b/spring-web-modules/spring-thymeleaf/pom.xml @@ -136,7 +136,7 @@ 2.3.2.RELEASE - 3.0.11.RELEASE + 3.1.2.RELEASE 3.0.4.RELEASE 2.4.1 2.0.1.Final From 25bfddf417ea1ce8feb994101ccf771f38c4ef02 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 14:15:27 +0100 Subject: [PATCH 694/831] Limit solving duration to 2 seconds --- .../java/com/baeldung/timefoldsolver/ShiftScheduleApp.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java index 24666ac6aa..e8dc02e2b3 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java @@ -20,9 +20,9 @@ public class ShiftScheduleApp { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 5 seconds on this small dataset. - // It's recommended to run for at least 5 minutes ("5m") otherwise. - .withTerminationSpentLimit(Duration.ofSeconds(5))); + // The solver runs only for 2 seconds on this tiny dataset. + // It's recommended to run for at least 5 minutes ("5m") on large datasets. + .withTerminationSpentLimit(Duration.ofSeconds(2))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); From 5df3c5711ada202a685a1f193f0bb2a32986c806 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 14:35:43 +0100 Subject: [PATCH 695/831] Make PMD happy --- ...erTest.java => ShiftScheduleConstraintProviderUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename timefold-solver/src/test/java/com/baeldung/timefoldsolver/{ShiftScheduleConstraintProviderTest.java => ShiftScheduleConstraintProviderUnitTest.java} (97%) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java similarity index 97% rename from timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java rename to timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 0832cd7bdd..3a3f4dc032 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import ai.timefold.solver.test.api.score.stream.ConstraintVerifier; -class ShiftScheduleConstraintProviderTest { +class ShiftScheduleConstraintProviderUnitTest { private static final LocalDate MONDAY = LocalDate.of(2030, 4, 1); private static final LocalDate TUESDAY = LocalDate.of(2030, 4, 2); From d0a2127248b1e7ef0cf13706422b35b620c78042 Mon Sep 17 00:00:00 2001 From: Lucian Snare Date: Sat, 25 Nov 2023 10:35:19 -0500 Subject: [PATCH 696/831] BAEL-7083: Gson class declares multiple fields (#15244) * Add initial classes and tests for Gson multiple fields error * Add test classes and exclusion strategy * Add test cases * Simplify example code --- .../gson/multiplefields/BasicStudent.java | 64 +++++++++++++++++ .../StudentExclusionStrategy.java | 18 +++++ .../gson/multiplefields/StudentV1.java | 34 +++++++++ .../gson/multiplefields/StudentV2.java | 71 +++++++++++++++++++ .../GsonMultipleFieldsUnitTest.java | 65 +++++++++++++++++ 5 files changed, 252 insertions(+) create mode 100644 json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/BasicStudent.java create mode 100644 json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentExclusionStrategy.java create mode 100644 json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV1.java create mode 100644 json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV2.java create mode 100644 json-modules/gson-2/src/test/java/com/baeldung/gson/multiplefields/GsonMultipleFieldsUnitTest.java diff --git a/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/BasicStudent.java b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/BasicStudent.java new file mode 100644 index 0000000000..9c8d5f0923 --- /dev/null +++ b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/BasicStudent.java @@ -0,0 +1,64 @@ +package com.baeldung.gson.multiplefields; + +import java.util.Objects; + +import com.google.gson.annotations.SerializedName; + +public class BasicStudent { + + private String name; + + private transient String major; + + @SerializedName("major") + private String concentration; + + public BasicStudent() { + + } + + public BasicStudent(String name, String major, String concentration) { + this.name = name; + this.major = major; + this.concentration = concentration; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof BasicStudent)) + return false; + BasicStudent student = (BasicStudent) o; + return Objects.equals(name, student.name) && Objects.equals(major, student.major) && Objects.equals(concentration, student.concentration); + } + + @Override + public int hashCode() { + return Objects.hash(name, major, concentration); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMajor() { + return major; + } + + public void setMajor(String major) { + this.major = major; + } + + public String getConcentration() { + return concentration; + } + + public void setConcentration(String concentration) { + this.concentration = concentration; + } +} diff --git a/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentExclusionStrategy.java b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentExclusionStrategy.java new file mode 100644 index 0000000000..5dad30a138 --- /dev/null +++ b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentExclusionStrategy.java @@ -0,0 +1,18 @@ +package com.baeldung.gson.multiplefields; + +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; + +public class StudentExclusionStrategy implements ExclusionStrategy { + + @Override + public boolean shouldSkipField(FieldAttributes field) { + // Ignore all field values from V1 type + return field.getDeclaringClass() == StudentV1.class; + } + + @Override + public boolean shouldSkipClass(Class aClass) { + return false; + } +} diff --git a/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV1.java b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV1.java new file mode 100644 index 0000000000..49a09b830c --- /dev/null +++ b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV1.java @@ -0,0 +1,34 @@ +package com.baeldung.gson.multiplefields; + +public class StudentV1 { + + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + // Default constructor for Gson + public StudentV1() { + + } + + public StudentV1(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + +} diff --git a/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV2.java b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV2.java new file mode 100644 index 0000000000..e31d33e3fd --- /dev/null +++ b/json-modules/gson-2/src/main/java/com/baeldung/gson/multiplefields/StudentV2.java @@ -0,0 +1,71 @@ +package com.baeldung.gson.multiplefields; + +import java.util.Objects; + +import com.google.gson.annotations.Expose; + +public class StudentV2 extends StudentV1 { + + @Expose + private String firstName; + + @Expose + private String lastName; + + @Expose + private String major; + + @Override + public String getFirstName() { + return firstName; + } + + @Override + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @Override + public String getLastName() { + return lastName; + } + + @Override + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getMajor() { + return major; + } + + public void setMajor(String major) { + this.major = major; + } + + // Default constructor for Gson + public StudentV2() { + + } + + public StudentV2(String firstName, String lastName, String major) { + this.firstName = firstName; + this.lastName = lastName; + this.major = major; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof StudentV2)) + return false; + StudentV2 studentV2 = (StudentV2) o; + return Objects.equals(firstName, studentV2.firstName) && Objects.equals(lastName, studentV2.lastName) && Objects.equals(major, studentV2.major); + } + + @Override + public int hashCode() { + return Objects.hash(firstName, lastName, major); + } +} diff --git a/json-modules/gson-2/src/test/java/com/baeldung/gson/multiplefields/GsonMultipleFieldsUnitTest.java b/json-modules/gson-2/src/test/java/com/baeldung/gson/multiplefields/GsonMultipleFieldsUnitTest.java new file mode 100644 index 0000000000..1ee2cd1bd8 --- /dev/null +++ b/json-modules/gson-2/src/test/java/com/baeldung/gson/multiplefields/GsonMultipleFieldsUnitTest.java @@ -0,0 +1,65 @@ +package com.baeldung.gson.multiplefields; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.Test; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class GsonMultipleFieldsUnitTest { + + @Test + public void givenBasicStudent_whenSerializingWithGson_thenTransientFieldNotSet() { + // Given a class with a transient field + BasicStudent student = new BasicStudent("Henry Winter", "Greek Studies", "Classical Greek Studies"); + + // When serializing using Gson + Gson gson = new Gson(); + String json = gson.toJson(student); + + // Then the deserialized instance doesn't contain the transient field value + BasicStudent deserialized = gson.fromJson(json, BasicStudent.class); + assertThat(deserialized.getMajor()).isNull(); + } + + @Test + public void givenStudentV2_whenSerializingWithGson_thenIllegalArgumentExceptionIsThrown() { + // Given a class with a class hierarchy that defines multiple fields with the same name + StudentV2 student = new StudentV2("Henry", "Winter", "Greek Studies"); + + // When serializing using Gson, then an IllegalArgumentException exception is thrown + Gson gson = new Gson(); + assertThatThrownBy(() -> gson.toJson(student)).isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("declares multiple JSON fields named 'firstName'"); + } + + @Test + public void givenStudentV2_whenSerializingWithGsonExposeAnnotation_thenSerializes() { + // Given a class with a class hierarchy that defines multiple fields with the same name + StudentV2 student = new StudentV2("Henry", "Winter", "Greek Studies"); + + // When serializing using Gson exclude fields without @Expose + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() + .create(); + + // Then ensure the student can be serialized, then deserialized back into an equal instance + String json = gson.toJson(student); + assertThat(gson.fromJson(json, StudentV2.class)).isEqualTo(student); + } + + @Test + public void givenStudentV2_whenSerializingWithGsonExclusionStrategy_thenSerializes() { + // Given a class with a class hierarchy that defines multiple fields with the same name + StudentV2 student = new StudentV2("Henry", "Winter", "Greek Studies"); + + // When serializing using Gson add an ExclusionStrategy + Gson gson = new GsonBuilder().setExclusionStrategies(new StudentExclusionStrategy()) + .create(); + + // Then ensure the student can be serialized, then deserialized back into an equal instance + assertThat(gson.fromJson(gson.toJson(student), StudentV2.class)).isEqualTo(student); + } + +} \ No newline at end of file From 2e60ba50079fbe296f326a281cda547ffc7bd2de Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 25 Nov 2023 21:09:32 +0100 Subject: [PATCH 697/831] Turn into a unit test to avoid main() --- timefold-solver/pom.xml | 4 ++-- .../ShiftScheduleConstraintProviderUnitTest.java | 1 + .../ShiftScheduleSolverUnitTest.java} | 13 ++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) rename timefold-solver/src/{main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java => test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java} (86%) diff --git a/timefold-solver/pom.xml b/timefold-solver/pom.xml index 2a219a593c..a16afb9e54 100644 --- a/timefold-solver/pom.xml +++ b/timefold-solver/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 timefold-solver timefold-solver diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 3a3f4dc032..3f68ef701e 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -24,6 +24,7 @@ class ShiftScheduleConstraintProviderUnitTest { // To avoid that, use forEachUniquePair() in the constraint instead. .penalizesBy(2); } + @Test void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { Employee ann = new Employee("Ann", null); diff --git a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java similarity index 86% rename from timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java rename to timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index e8dc02e2b3..45a84b40da 100644 --- a/timefold-solver/src/main/java/com/baeldung/timefoldsolver/ShiftScheduleApp.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -5,18 +5,21 @@ import java.time.LocalDate; import java.util.List; import java.util.Set; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; +import ai.timefold.solver.core.config.solver.termination.TerminationConfig; -public class ShiftScheduleApp { +public class ShiftScheduleSolverUnitTest { - private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleApp.class); + private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); - public static void main(String[] args) { + @Test + public void solve() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) @@ -30,7 +33,7 @@ public class ShiftScheduleApp { printSolution(solution); } - private static ShiftSchedule loadProblem() { + private ShiftSchedule loadProblem() { LocalDate monday = LocalDate.of(2030, 4, 1); LocalDate tuesday = LocalDate.of(2030, 4, 2); return new ShiftSchedule( @@ -40,7 +43,7 @@ public class ShiftScheduleApp { new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender"))); } - private static void printSolution(ShiftSchedule solution) { + private void printSolution(ShiftSchedule solution) { logger.info("Shift assignments"); for (Shift shift : solution.getShifts()) { logger.info(" " + shift.getStart() From 289281024037e63530b434b360816710c014c1da Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 26 Nov 2023 11:55:41 +0200 Subject: [PATCH 698/831] baeldung-articles: baeldung-articlesBAEL-7234 Commit to a new article (How to convert JsonNode to ObjectNode). Adding a test class (JsonNodeToJsonObjectUnitTest). --- .../JsonNodeToJsonObjectUnitTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java new file mode 100644 index 0000000000..e5a12869ea --- /dev/null +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.jsonnodetojsonobject; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class JsonNodeToJsonObjectUnitTest { + public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}"; + + @Test + public void givenJsonNode_whenConvertingToObjectNode_thenVerifyFieldsIntegrity() throws JsonProcessingException { + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.readTree(jsonString); + ObjectNode objectNode = objectMapper.createObjectNode().setAll((ObjectNode) jsonNode); + + assertEquals("John", objectNode.get("name").asText()); + assertEquals("male", objectNode.get("gender").asText()); + assertEquals("Baeldung", objectNode.get("company").asText()); + assertTrue(objectNode.get("isEmployee").asBoolean()); + assertEquals(30, objectNode.get("age").asInt()); + } +} From 65676eb275409ded4484e487b4cbde472a5e6793 Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 26 Nov 2023 12:50:53 +0100 Subject: [PATCH 699/831] Java-27655 | removing WebSecurityConfigurerAdapter from httpclient4 module --- .../filter/CustomWebSecurityConfigurerAdapter.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java index fb597e46c8..eaf166a091 100644 --- a/apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java +++ b/apache-httpclient4/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java @@ -7,14 +7,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @Configuration @EnableWebSecurity -public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { +public class CustomWebSecurityConfigurerAdapter { @Autowired private RestAuthenticationEntryPoint authenticationEntryPoint; @@ -27,8 +27,8 @@ public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAda .authorities("ROLE_USER"); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/securityNone") @@ -40,6 +40,8 @@ public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAda .authenticationEntryPoint(authenticationEntryPoint); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); + + return http.build(); } @Bean From 033fff1e5ef9e00cec85028a9861c5baf4c51dbc Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 26 Nov 2023 13:12:19 +0100 Subject: [PATCH 700/831] Java-27655 | moved jenkins module to more recent implementation of web security --- .../WebSecurityConfiguration.java | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/jmeter/src/main/java/com/baeldung/configuration/WebSecurityConfiguration.java b/jmeter/src/main/java/com/baeldung/configuration/WebSecurityConfiguration.java index 8700dc3df4..033281e07f 100644 --- a/jmeter/src/main/java/com/baeldung/configuration/WebSecurityConfiguration.java +++ b/jmeter/src/main/java/com/baeldung/configuration/WebSecurityConfiguration.java @@ -1,52 +1,44 @@ package com.baeldung.configuration; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { +public class WebSecurityConfiguration { - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - + @Bean + public InMemoryUserDetailsManager userDetailsService() { PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); - - auth.inMemoryAuthentication() - .withUser("admin").password(encoder.encode("admin")).roles("USER", "ADMIN") - .and() - .withUser("user1").password(encoder.encode("password1")).roles("USER") - .and() - .withUser("user2").password(encoder.encode("password2")).roles("USER") - .and() - .withUser("user3").password(encoder.encode("password3")).roles("USER") - .and() - .withUser("user4").password(encoder.encode("password4")).roles("USER") - .and() - .withUser("user5").password(encoder.encode("password5")).roles("USER") - .and() - .withUser("user6").password(encoder.encode("password6")).roles("USER") - .and() - .withUser("user7").password(encoder.encode("password7")).roles("USER") - .and() - .withUser("user8").password(encoder.encode("password8")).roles("USER") - .and() - .withUser("user9").password(encoder.encode("password9")).roles("USER") - .and() - .withUser("user10").password(encoder.encode("password10")).roles("USER"); + + Set users = new HashSet<>(); + users.add(User.withUsername("admin").password(encoder.encode("admin")).roles("USER", "ADMIN").build()); + for(int i=1;i<=10;i++){ + users.add(User.withUsername("user"+i).password(encoder.encode("password")+i).roles("USER").build()); + } + + return new InMemoryUserDetailsManager(users); } - @Override - protected void configure(HttpSecurity http) throws Exception { - + @Bean + public SecurityFilterChain securityFilter(HttpSecurity http) throws Exception { + http .authorizeRequests() .antMatchers("/secured/**").authenticated() .anyRequest().permitAll() .and() .httpBasic(); + + return http.build(); } } From 0973a63e5c2e312c2bf9839c6da8d1f91a13ade3 Mon Sep 17 00:00:00 2001 From: gaepi Date: Sun, 26 Nov 2023 13:33:08 +0100 Subject: [PATCH 701/831] Java-27655 | removed deprecated WebSecurityConfigAdapter from security-modules/jjwt module --- .../jjwtfun/config/WebSecurityConfig.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java index 687a827448..e453f33d5e 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java @@ -4,9 +4,11 @@ import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.jjwtfun.service.SecretService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.csrf.CsrfFilter; import org.springframework.security.web.csrf.CsrfToken; import org.springframework.security.web.csrf.CsrfTokenRepository; @@ -21,19 +23,19 @@ import java.io.IOException; import java.util.Arrays; @Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig { @Autowired - CsrfTokenRepository jwtCsrfTokenRepository; + private CsrfTokenRepository jwtCsrfTokenRepository; @Autowired - SecretService secretService; + private SecretService secretService; // ordered so we can use binary search below - private String[] ignoreCsrfAntMatchers = { "/dynamic-builder-compress", "/dynamic-builder-general", "/dynamic-builder-specific", "/set-secrets" }; + private final String[] ignoreCsrfAntMatchers = { "/dynamic-builder-compress", "/dynamic-builder-general", "/dynamic-builder-specific", "/set-secrets" }; - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.addFilterAfter(new JwtCsrfValidatorFilter(), CsrfFilter.class) .csrf() .csrfTokenRepository(jwtCsrfTokenRepository) @@ -42,6 +44,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests() .antMatchers("/**") .permitAll(); + + return http.build(); } private class JwtCsrfValidatorFilter extends OncePerRequestFilter { From 0b2981b94e48a35ea0ad46c0a4091b0ae4f3eba8 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 26 Nov 2023 19:10:19 +0100 Subject: [PATCH 702/831] [negate-int] using logger instead of sys.print.out --- .../com/baeldung/negate/NegateIntUnitTest.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java index 15fffde6ed..3cb93d243d 100644 --- a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java @@ -1,10 +1,14 @@ package com.baeldung.negate; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static org.junit.jupiter.api.Assertions.*; public class NegateIntUnitTest { + private static Logger LOG = LoggerFactory.getLogger(NegateIntUnitTest.class); + @Test void whenUsingUnaryMinusOperator_thenGetExpectedResult() { int x = 42; @@ -30,18 +34,20 @@ public class NegateIntUnitTest { } @Test - void whenUsingUnaryMinusOperatorWithMinInt_thenCannotGetExpectedResult() { + void givenIntMinValue_whenUsingUnaryMinusOperator_thenCannotGetExpectedResult() { int min = Integer.MIN_VALUE; - System.out.println("The value of '-min' is: " + -min); - assertFalse((-min) > 0); + LOG.info("The value of '-min' is: " + -min); + + assertTrue((-min) < 0); } @Test - void whenUsingBitwiseComplementOperatorWithMinInt_thenCannotGetExpectedResult() { + void givenIntMinValue_whenUsingBitwiseComplementOperator_thenCannotGetExpectedResult() { int min = Integer.MIN_VALUE; int result = ~min + 1; - System.out.println("The value of '~min + 1' is: " + result); - assertFalse(result > 0); + LOG.info("The value of '~min + 1' is: " + result); + + assertTrue(result < 0); } From 62cc5adfbbce8379f7dd5ec8f39162262b133f94 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 26 Nov 2023 20:59:53 +0100 Subject: [PATCH 703/831] [negate-int] add an empty line --- .../src/test/java/com/baeldung/negate/NegateIntUnitTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java index 3cb93d243d..444f4931d3 100644 --- a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/negate/NegateIntUnitTest.java @@ -7,7 +7,8 @@ import org.slf4j.LoggerFactory; import static org.junit.jupiter.api.Assertions.*; public class NegateIntUnitTest { - private static Logger LOG = LoggerFactory.getLogger(NegateIntUnitTest.class); + + private static final Logger LOG = LoggerFactory.getLogger(NegateIntUnitTest.class); @Test void whenUsingUnaryMinusOperator_thenGetExpectedResult() { From d69a3ac6bdad86358b3e5c7b55c8779a7bc6143d Mon Sep 17 00:00:00 2001 From: Bhaskar Ghosh Dastidar Date: Mon, 27 Nov 2023 09:13:04 +0530 Subject: [PATCH 704/831] [BAEL-6787] Increment map value benchmark - JMH (#15268) * [BAEL-6787] jmh class added * [BAEL-6787] jmh pom --------- Co-authored-by: Bhaskar --- .../core-java-collections-maps-7/pom.xml | 10 +++ .../BenchmarkMapMethods.java | 2 +- .../BenchmarkMapMethodsJMH.java | 68 +++++++++++++++++++ .../IncrementMapValueWays.java | 2 +- .../IncrementMapValueUnitTest.java | 4 +- 5 files changed, 83 insertions(+), 3 deletions(-) rename core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/{ => incrementmapkey}/BenchmarkMapMethods.java (99%) create mode 100644 core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethodsJMH.java rename core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/{ => incrementmapkey}/IncrementMapValueWays.java (98%) rename core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/{ => incrementmapkey}/IncrementMapValueUnitTest.java (97%) diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index a05b1b3528..2d08c0a438 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -38,6 +38,16 @@ guava 32.1.2-jre + + org.openjdk.jmh + jmh-core + 1.37 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.37 + diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethods.java similarity index 99% rename from core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java rename to core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethods.java index eca028efe4..563b2ffdae 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/BenchmarkMapMethods.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethods.java @@ -1,4 +1,4 @@ -package com.baeldung.map; +package com.baeldung.map.incrementmapkey; import java.util.HashMap; import java.util.Map; diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethodsJMH.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethodsJMH.java new file mode 100644 index 0000000000..4ddf3886e9 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/BenchmarkMapMethodsJMH.java @@ -0,0 +1,68 @@ +package com.baeldung.map.incrementmapkey; + +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; + +@State(Scope.Benchmark) +public class BenchmarkMapMethodsJMH { + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @Fork(value = 1, warmups = 1) + public void benchMarkGuavaMap() { + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingAtomicMap(getString()); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @Fork(value = 1, warmups = 1) + public void benchContainsKeyMap() { + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingContainsKey(getString()); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @Fork(value = 1, warmups = 1) + public void benchMarkComputeMethod() { + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingCompute(getString()); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.NANOSECONDS) + @Fork(value = 1, warmups = 1) + public void benchMarkMergeMethod() { + IncrementMapValueWays im = new IncrementMapValueWays(); + im.charFrequencyUsingMerge(getString()); + } + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + + private String getString() { + return + "Once upon a time in a quaint village nestled between rolling hills and whispering forests, there lived a solitary storyteller named Elias. Elias was known for spinning tales that transported listeners to magical realms and awakened forgotten dreams.\n" + + "\n" + + "His favorite spot was beneath an ancient oak tree, its sprawling branches offering shade to those who sought refuge from the bustle of daily life. Villagers of all ages would gather around Elias, their faces illuminated by the warmth of his stories.\n" + + "\n" + "One evening, as dusk painted the sky in hues of orange and purple, a curious young girl named Lily approached Elias. Her eyes sparkled with wonder as she asked for a tale unlike any other.\n" + "\n" + + "Elias smiled, sensing her thirst for adventure, and began a story about a forgotten kingdom veiled by mist, guarded by mystical creatures and enchanted by ancient spells. With each word, the air grew thick with anticipation, and the listeners were transported into a world where magic danced on the edges of reality.\n" + + "\n" + "As Elias weaved the story, Lily's imagination took flight. She envisioned herself as a brave warrior, wielding a shimmering sword against dark forces, her heart fueled by courage and kindness.\n" + "\n" + + "The night wore on, but the spell of the tale held everyone captive. The villagers laughed, gasped, and held their breaths, journeying alongside the characters through trials and triumphs.\n" + "\n" + + "As the final words lingered in the air, a sense of enchantment settled upon the listeners. They thanked Elias for the gift of his storytelling, each carrying a piece of the magical kingdom within their hearts.\n" + "\n" + + "Lily, inspired by the story, vowed to cherish the spirit of adventure and kindness in her own life. With a newfound spark in her eyes, she bid Elias goodnight, already dreaming of the countless adventures awaiting her.\n" + "\n" + + "Under the star-studded sky, Elias remained beneath the ancient oak, his heart aglow with the joy of sharing tales that ignited imagination and inspired dreams. And as the night embraced the village, whispers of the enchanted kingdom lingered in the breeze, promising endless possibilities to those who dared to believe."; + } +} diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/IncrementMapValueWays.java similarity index 98% rename from core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java rename to core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/IncrementMapValueWays.java index 70b3c6c54d..e15b3aae8e 100644 --- a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/IncrementMapValueWays.java +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/incrementmapkey/IncrementMapValueWays.java @@ -1,4 +1,4 @@ -package com.baeldung.map; +package com.baeldung.map.incrementmapkey; import java.util.HashMap; import java.util.Map; diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/incrementmapkey/IncrementMapValueUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java rename to core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/incrementmapkey/IncrementMapValueUnitTest.java index df4f2b787e..64b9e1155d 100644 --- a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/IncrementMapValueUnitTest.java +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/incrementmapkey/IncrementMapValueUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.map; +package com.baeldung.map.incrementmapkey; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -9,6 +9,8 @@ import java.util.stream.Stream; import org.junit.Assert; import org.junit.Test; +import com.baeldung.map.incrementmapkey.IncrementMapValueWays; + public class IncrementMapValueUnitTest { @Test From 5d6b5bf965f49e640726e8df7f707002df8c20fc Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Mon, 27 Nov 2023 05:52:14 +0200 Subject: [PATCH 705/831] This commit is related to BAEL-7254 (#15299) This commit aims to add a new test class "ByteToCharArrayUnitTest" that validates the conversion process of a Byte array into a Char array. --- .../conversions/ByteToCharArrayUnitTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteToCharArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteToCharArrayUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteToCharArrayUnitTest.java new file mode 100644 index 0000000000..c62520cedc --- /dev/null +++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteToCharArrayUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.array.conversions; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.StandardCharsets; + +import static org.junit.Assert.assertArrayEquals; + +public class ByteToCharArrayUnitTest { + public static byte[] byteArray = {65, 66, 67, 68}; + public static char[] expected = {'A', 'B', 'C', 'D'}; + + @Test + public void givenByteArray_WhenUsingStandardCharsets_thenConvertToCharArray() { + char[] charArray = new String(byteArray, StandardCharsets.UTF_8).toCharArray(); + assertArrayEquals(expected, charArray); + } + + @Test + public void givenByteArray_WhenUsingSUsingStreams_thenConvertToCharArray() throws IOException { + ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); + InputStreamReader reader = new InputStreamReader(inputStream); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + int data; + while ((data = reader.read()) != -1) { + char ch = (char) data; + outputStream.write(ch); + } + char[] charArray = outputStream.toString().toCharArray(); + assertArrayEquals(expected, charArray); + } + + @Test + public void givenByteArray_WhenUsingCharBuffer_thenConvertToCharArray() { + ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray); + CharBuffer charBuffer = StandardCharsets.UTF_8.decode(byteBuffer); + char[] charArray = new char[charBuffer.remaining()]; + charBuffer.get(charArray); + assertArrayEquals(expected, charArray); + } +} From 7284c7462c591bd872241cfc5f4a0543398b5bf7 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:19:12 +0530 Subject: [PATCH 706/831] BAEL-7259 --- persistence-modules/java-harperdb/pom.xml | 61 +++ .../src/main/resources/data-model.puml | 41 ++ .../baledung/harperdb/HarperDBApiService.java | 74 ++++ .../baledung/harperdb/HarperDBContainer.java | 42 +++ .../baledung/harperdb/HarperDBLiveTest.java | 336 +++++++++++++++++ .../harperdb/HarperDBLiveTestOld.java | 356 ++++++++++++++++++ 6 files changed, 910 insertions(+) create mode 100644 persistence-modules/java-harperdb/pom.xml create mode 100644 persistence-modules/java-harperdb/src/main/resources/data-model.puml create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java create mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml new file mode 100644 index 0000000000..896a58f858 --- /dev/null +++ b/persistence-modules/java-harperdb/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + com.baeldung + java-harperdb + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + com.baeldung + java-harperdb + 4.2 + system + ${project.basedir}/lib/cdata.jdbc.harperdb.jar + + + org.testcontainers + testcontainers + test + + + + + + + org.testcontainers + testcontainers-bom + 1.19.3 + pom + import + + + + + + 19 + 19 + UTF-8 + + + \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/main/resources/data-model.puml b/persistence-modules/java-harperdb/src/main/resources/data-model.puml new file mode 100644 index 0000000000..8e3681c749 --- /dev/null +++ b/persistence-modules/java-harperdb/src/main/resources/data-model.puml @@ -0,0 +1,41 @@ +@startuml +'https://gist.github.com/QuantumGhost/0955a45383a0b6c0bc24f9654b3cb561 +' uncomment the line below if you're using computer with a retina display +' skinparam dpi 300 +!theme sketchy-outline +!define Table(name,desc) class name as "desc" << (T, #63b175) >> +' we use bold for primary key +' green color for unique +' and underscore for not_null +!define primary_key(x) x +!define unique(x) x +!define not_null(x) x +' other tags available: +' +' , where color is a color name or html color code +' (#FFAACC) +' see: http://plantuml.com/classes.html#More +hide methods +hide stereotypes + +' entities + + +Table(Teacher, "Teacher") { + primary_key(Id) Number + Name Varchar + joining_date Date +} +Table(Subject, "Subject") { + primary_key(Id) Number + Name Varchar +} +Table(Teacher_Details, "Teacher_Details") { + primary_key(Id) Number + teacher_id Number + subject_id Number +} + +Teacher_Details "*" -left-> "1" Subject: " " +Teacher "1" -left-> "*" Teacher_Details: " " +@enduml \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java new file mode 100644 index 0000000000..1eedd8648f --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java @@ -0,0 +1,74 @@ +package com.baledung.harperdb; + +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.Base64; + +public class HarperDBApiService { + private String url; + private String base64auth; + + public HarperDBApiService(String url, String user, String password) { + this.url = url; + this.base64auth = Base64.getEncoder() + .encodeToString(new StringBuilder().append(user).append(":").append(password).toString().getBytes()); + } + + private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); + + public void createSchema(String schema) throws IOException { + String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; + executeHttpPostRequest(requestBody); + } + + public void createTable(String schema, String table, String ... attributes) throws IOException { + String createTableReq = "{\"operation\":\"create_table\"," + + "\"schema\":\"" + schema + + "\",\"table\":\"" + table + + "\",\"hash_attribute\":\"id\"" + + "}"; + executeHttpPostRequest(createTableReq); + LOGGER.info("created table:" + table); + for (String attribute : attributes) { + String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" + + schema + "\",\"table\":\"" + + table + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; + executeHttpPostRequest(createAttrReq); + LOGGER.info("created attribute:" + attribute + " in table:" + table); + } + } + + public void insertRecords(String schema, String table, String records) throws IOException { + String requestBody = "{\"table\":" + "\"" + table + "\"," + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + "insert" + "\"" + "," + + "\"records\":" + records + + "}"; + executeHttpPostRequest(requestBody); + } + + private void executeHttpPostRequest(String httpRequest) throws IOException { + LOGGER.info("Post request body:" + httpRequest); + + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + HttpPost request = new HttpPost(this.url); + request.addHeader("Authorization", "Basic " + this.base64auth); + request.addHeader("Content-Type", "application/json"); + request.setEntity((HttpEntity) new StringEntity(httpRequest)); + CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); + LOGGER.info("REST API response:" + response.toString()); + assert(200 == response.getCode()); + } + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java new file mode 100644 index 0000000000..79656b1b73 --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java @@ -0,0 +1,42 @@ +package com.baledung.harperdb; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.util.Map; + +public class HarperDBContainer { + private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class); + + + + private static final Map DEFAULT_ENV_MAP = Map.of( + "HDB_ADMIN_USERNAME", "admin", + "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", + "ROOTPATH", "/home/harperdb/hdb", + "LOGGING_STDSTREAMS", "true" + ); + + private static final Integer[] DEFAULT_EXPOSED_PORTS = {9925, 9926}; + + private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest"; + + public void stop() { + harperDBContainer.stop(); + } + GenericContainer harperDBContainer; + public GenericContainer installHarperDB() { + harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE) + .withEnv(DEFAULT_ENV_MAP) + .withExposedPorts(DEFAULT_EXPOSED_PORTS); + return harperDBContainer; + } + + public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer ... exposedPorts) { + return new GenericContainer(dockerImgage) + .withEnv(envMap) + .withExposedPorts(exposedPorts); + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java new file mode 100644 index 0000000000..767d9d971b --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -0,0 +1,336 @@ +package com.baledung.harperdb; + +import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.sql.*; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.*; + +public class HarperDBLiveTest { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); + + private static String host; + + private static Integer port; + + private static HarperDBContainer harperDBContainer; + private static HarperDBApiService harperDbApiService; + + @BeforeAll + static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { + installHarperDB(); + initHarperDBApiService(); + setupDB(); + } + + private static void installHarperDB() { + harperDBContainer = new HarperDBContainer(); + + GenericContainer genericContainer = harperDBContainer.installHarperDB(); + + host = genericContainer.getHost(); + genericContainer.start(); + + port = genericContainer.getFirstMappedPort(); + } + + private static void initHarperDBApiService() { + String url = "http://localhost:" + port + "/"; + harperDbApiService = new HarperDBApiService(url, "admin", "password"); + } + + private static void setupDB() throws URISyntaxException, IOException { + harperDbApiService.createSchema("Demo"); + + harperDbApiService.createTable("Demo", "Subject", "name"); + harperDbApiService.createTable("Demo", "Teacher", "name", "joining_date", "subject_id"); + harperDbApiService.createTable("Demo", "Teacher_Details", "teacher_id", "subject_id"); + + insertSubjectRecords(); + insertTeacherRecords(); + insertTeacherDetailsRecords(); + } + + private static void insertSubjectRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"name\":\"English\"}," + + "{\"id\":2, \"name\":\"Maths\"}," + + "{\"id\":3, \"name\":\"Science\"}" + + "]"; + + harperDbApiService.insertRecords("Demo", "Subject", records); + } + + private static void insertTeacherRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + + "]"; + harperDbApiService.insertRecords("Demo", "Teacher", records); + } + + private static void insertTeacherDetailsRecords() throws IOException { + String records = "[" + + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," + + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," + + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," + + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," + + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + + "]"; + + harperDbApiService.insertRecords("Demo", "Teacher_Details", records); + } + + @AfterAll + static void stopHarperDB() { + harperDBContainer.stop(); + } + + @Test + void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + + try (Connection connection = DriverManager.getConnection(JDBC_URL)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + + try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionPooling_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); + final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + + ";User=admin;Password=password;"; + harperdbPoolDataSource.setURL(JDBC_URL); + + try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Pool Successful"); + } + }); + } + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from Demo.student"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + } + } + + @Test + void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date) " + + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; + final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); + preparedStatement.setString(1, "David Sirocco"); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("name"); + String joinDate = resultSet.getString("joining_date"); + assertEquals("David Sirocco", teacherName); + assertEquals("04-05-2004", joinDate); + logger.info("name:" + teacherName + " joining date:" + joinDate); + } + } + } + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.student where id = 3"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.student where name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setString(1, "James"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 5); + preparedStatement.setInt(2, 1); + preparedStatement.setString(3, "John"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + //@Test + void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + + "values(?, ?, ?, ?)"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 9); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.setString(4, "[1, 3]"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 10); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.setString(4, "[1, 2]"); + + preparedStatement.addBatch(); + + assertDoesNotThrow(() -> preparedStatement.executeBatch()); + } + } + + + @Test + void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { + final String JOIN_QUERY = "SELECT t.name as teacher_name, s.name as subject_name " + + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + + + ResultSet resultSet = statement.executeQuery(JOIN_QUERY); + while (resultSet.next()) { + logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + + resultSet.getString("subject_name")); + } + + + } + + } + + @Test + void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { + final String CREATE_TABLE_SQL = "CreateTable"; + try(Connection connection = getConnection()) { + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + + callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("TableName", "subject"); + callableStatement.setString("PrimaryKey", "id"); + Boolean result = callableStatement.execute(); + + ResultSet resultSet = callableStatement.getResultSet(); + + while(resultSet.next()) { + String tableCreated = resultSet.getString("Success"); + assertEquals("true", tableCreated); + logger.info("result of the callable execute:" + tableCreated); + } + } + } +} diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java new file mode 100644 index 0000000000..8becea76a5 --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java @@ -0,0 +1,356 @@ +package com.baledung.harperdb; + +import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; +import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.GenericContainer; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.sql.*; +import java.util.Map; +import java.util.Properties; + +import static org.junit.jupiter.api.Assertions.*; + +public class HarperDBLiveTestOld { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTestOld.class); + + private static String host; + + private static Integer port; + + private static GenericContainer harperDBContainer; + + @BeforeAll + static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { + installHarperDB(); + setupDB(); + } + + private static void installHarperDB() { + Map envMap = Map.of( + "HDB_ADMIN_USERNAME", "admin", + "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", + "ROOTPATH", "/home/harperdb/hdb", + "LOGGING_STDSTREAMS", "true" + ); + + harperDBContainer = new GenericContainer("harperdb/harperdb:latest") + .withEnv(envMap) + .withExposedPorts(9925, 9926); + host = harperDBContainer.getHost(); + harperDBContainer.start(); + port = harperDBContainer.getFirstMappedPort(); + logger.info("DB Host:" + host + "\n DB Port:" + port); + } + + private static void setupDB() throws URISyntaxException, IOException { + setupSchema("demo"); + createTable("demo", "student", "name", "grade", "subject_id"); + createTable("demo", "teacher", "name", "joining_date", "subject_id"); + insertRecords(); + } + + private static void setupSchema(String schema) throws URISyntaxException, IOException { + String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; + executeHttpPostRequest(requestBody); + } + + private static void executeHttpPostRequest(String httpRequest) throws IOException { + logger.info("Post request body:" + httpRequest); + + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + HttpPost request = new HttpPost("http://localhost:" + port + "/"); + request.addHeader("Authorization", "Basic YWRtaW46cGFzc3dvcmQ="); + request.addHeader("Content-Type", "application/json"); + request.setEntity((HttpEntity) new StringEntity(httpRequest)); + CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); + logger.info("REST API response:" + response.toString()); + assertEquals(200, response.getCode()); + } + } + + private void insertStudentRecords() { + + } + + private void insertSubjectRecords() { + + } + + private void insertTeacherRecords() { + + } + + private static void createTable(String schemaName, String tableName, String... attributes) throws IOException { + String createTableReq = "{\"operation\":\"create_table\",\"schema\":\"" + + schemaName + "\",\"table\":\"" + + tableName + "\",\"hash_attribute\":\"id\"" + + "}"; + executeHttpPostRequest(createTableReq); + logger.info("created table:" + tableName); + for (String attribute : attributes) { + String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" + + schemaName + "\",\"table\":\"" + + tableName + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; + executeHttpPostRequest(createAttrReq); + logger.info("created attribute:" + attribute + " in table:" + tableName); + } + } + + private static void insertRecords() throws IOException { + + String table = "student"; + String schema = "demo"; + String operation = "insert"; + String records = "[" + + "{\"id\":1, \"name\":\"John\", \"grade\":4}," + + "{\"id\":2, \"name\":\"James\", \"grade\":1}," + + "{\"id\":3, \"name\":\"Williams\", \"grade\":1}," + + "{\"id\":4, \"name\":\"Robin\", \"grade\":4}," + + "{\"id\":5, \"name\":\"Torry\", \"grade\":3}," + + "{\"id\":6, \"name\":\"Nancy\", \"grade\":5}," + + "{\"id\":7, \"name\":\"Mary\", \"grade\":5}," + + "{\"id\":8, \"name\":\"Jenny\", \"grade\":6}," + + "{\"id\":9, \"name\":\"Katy\", \"grade\":6}," + + "{\"id\":15, \"name\":\"Michael\", \"grade\":6}" + + "]"; + String requestBody = "{\"table\":" + "\"" + table + "\"," + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + operation + "\"" + "," + + "\"records\":" + records + + "}"; + String sql = "{" + + "\"operation\":\"sql\", " + + "\"sql\":\"insert into demo.student(id, name, grade) values" + + "(1, 'John', 4), (2, 'James', 1), (3, 'Williams', 1), (4, 'Robin', 4), (5, 'Torry', 3)," + + " (6, 'Nancy', 5), (7, 'Mary', 5), (8, 'Jenny', 6), (9, 'Katy', 6)\"" + + "}"; + executeHttpPostRequest(requestBody); + } + + @AfterAll + static void stopHarperDB() { + harperDBContainer.stop(); + } + + @Test + void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + + try (Connection connection = DriverManager.getConnection(URL)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + + try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + @Test + void whenConnectionPooling_thenConnectSuccess() throws SQLException { + assertDoesNotThrow(() -> { + HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); + String URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + + ";User=admin;Password=1234;"; + harperdbPoolDataSource.setURL(URL); + + try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { + connection.createStatement().executeQuery("select 1"); + logger.info("Connection Successful"); + } + }); + } + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from demo.student"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.student(id, name, grade) values (10, 'Barak', 3)"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + } + } + + @Test + void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date) " + + "values (1, 'David Martinez', '04-05-2004'), (2, 'Eric Martin', '04-10-2000')"; + final String QUERY_SQL = "select name, joining_date from demo.teacher where name = ?"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); + preparedStatement.setString(1, "Eric Martin"); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("name"); + String joinDate = resultSet.getString("joining_date"); + assertEquals("Eric Martin", teacherName); + assertEquals("04-10-2000", joinDate); + logger.info("name:" + teacherName + " joining date:" + joinDate); + } + } + } + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update demo.student set grade = 4 where id = 5"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from demo.student where id = 3"; + + try(Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name, grade from demo.student where name = ? and grade = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from demo.student where name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setString(1, "James"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update demo.student set grade = ? where id = ? and name = ?"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 5); + preparedStatement.setInt(2, 1); + preparedStatement.setString(3, "John"); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } + + @Test + void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { + final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date)" + + "values(?, ?, ?)"; + + try(Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 1); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 2); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.addBatch(); + + assertDoesNotThrow(() -> preparedStatement.executeBatch()); + } + } + + @Test + void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { + final String CREATE_TABLE_SQL = "CreateTable"; + try(Connection connection = getConnection()) { + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + + callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("TableName", "subject"); + callableStatement.setString("PrimaryKey", "id"); + Boolean result = callableStatement.execute(); + + ResultSet resultSet = callableStatement.getResultSet(); + + while(resultSet.next()) { + String tableCreated = resultSet.getString("Success"); + assertEquals("true", tableCreated); + logger.info("result of the callable execute:" + tableCreated); + } + } + } +} From 1a63be903582dd95c93499039a363f91c678d281 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:27:27 +0530 Subject: [PATCH 707/831] BAEL-7259 --- .../baledung/harperdb/HarperDBApiService.java | 38 +++--- .../baledung/harperdb/HarperDBContainer.java | 32 ++--- .../baledung/harperdb/HarperDBLiveTest.java | 123 ++++++++---------- 3 files changed, 89 insertions(+), 104 deletions(-) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java index 1eedd8648f..15178f9769 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java @@ -14,17 +14,20 @@ import java.io.IOException; import java.util.Base64; public class HarperDBApiService { + private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); private String url; private String base64auth; public HarperDBApiService(String url, String user, String password) { this.url = url; this.base64auth = Base64.getEncoder() - .encodeToString(new StringBuilder().append(user).append(":").append(password).toString().getBytes()); + .encodeToString(new StringBuilder().append(user) + .append(":") + .append(password) + .toString() + .getBytes()); } - private static final Logger LOGGER = LoggerFactory.getLogger(HarperDBApiService.class); - public void createSchema(String schema) throws IOException { String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; executeHttpPostRequest(requestBody); @@ -32,18 +35,18 @@ public class HarperDBApiService { public void createTable(String schema, String table, String ... attributes) throws IOException { String createTableReq = "{\"operation\":\"create_table\"," - + "\"schema\":\"" + schema - + "\",\"table\":\"" + table - + "\",\"hash_attribute\":\"id\"" - + "}"; + + "\"schema\":\"" + schema + + "\",\"table\":\"" + table + + "\",\"hash_attribute\":\"id\"" + + "}"; executeHttpPostRequest(createTableReq); LOGGER.info("created table:" + table); for (String attribute : attributes) { String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" - + schema + "\",\"table\":\"" - + table + "\",\"attribute\":\"" - + attribute + "\"" - + "}"; + + schema + "\",\"table\":\"" + + table + "\",\"attribute\":\"" + + attribute + "\"" + + "}"; executeHttpPostRequest(createAttrReq); LOGGER.info("created attribute:" + attribute + " in table:" + table); } @@ -51,24 +54,25 @@ public class HarperDBApiService { public void insertRecords(String schema, String table, String records) throws IOException { String requestBody = "{\"table\":" + "\"" + table + "\"," - + "\"schema\":" + "\"" + schema + "\"" + "," - + "\"operation\":" + "\"" + "insert" + "\"" + "," - + "\"records\":" + records - + "}"; + + "\"schema\":" + "\"" + schema + "\"" + "," + + "\"operation\":" + "\"" + "insert" + "\"" + "," + + "\"records\":" + records + + "}"; executeHttpPostRequest(requestBody); } private void executeHttpPostRequest(String httpRequest) throws IOException { LOGGER.info("Post request body:" + httpRequest); - try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { + try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create() + .build()) { HttpPost request = new HttpPost(this.url); request.addHeader("Authorization", "Basic " + this.base64auth); request.addHeader("Content-Type", "application/json"); request.setEntity((HttpEntity) new StringEntity(httpRequest)); CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); LOGGER.info("REST API response:" + response.toString()); - assert(200 == response.getCode()); + assert (200 == response.getCode()); } } } diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java index 79656b1b73..5ce6e069ce 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java @@ -1,42 +1,36 @@ package com.baledung.harperdb; +import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; -import java.util.Map; - public class HarperDBContainer { + private final static Logger LOGGER = LoggerFactory.getLogger(HarperDBContainer.class); + private static final Map DEFAULT_ENV_MAP = Map.of("HDB_ADMIN_USERNAME", "admin", "HDB_ADMIN_PASSWORD", "password", + "OPERATIONSAPI_NETWORK_PORT", "9925", "ROOTPATH", "/home/harperdb/hdb", "LOGGING_STDSTREAMS", "true"); - - private static final Map DEFAULT_ENV_MAP = Map.of( - "HDB_ADMIN_USERNAME", "admin", - "HDB_ADMIN_PASSWORD", "password", - "OPERATIONSAPI_NETWORK_PORT", "9925", - "ROOTPATH", "/home/harperdb/hdb", - "LOGGING_STDSTREAMS", "true" - ); - - private static final Integer[] DEFAULT_EXPOSED_PORTS = {9925, 9926}; + private static final Integer[] DEFAULT_EXPOSED_PORTS = { 9925, 9926 }; private static final String HARPER_DOCKER_IMAGE = "harperdb/harperdb:latest"; public void stop() { harperDBContainer.stop(); } + GenericContainer harperDBContainer; + public GenericContainer installHarperDB() { - harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE) - .withEnv(DEFAULT_ENV_MAP) - .withExposedPorts(DEFAULT_EXPOSED_PORTS); + harperDBContainer = new GenericContainer(HARPER_DOCKER_IMAGE).withEnv(DEFAULT_ENV_MAP) + .withExposedPorts(DEFAULT_EXPOSED_PORTS); return harperDBContainer; } - public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer ... exposedPorts) { - return new GenericContainer(dockerImgage) - .withEnv(envMap) - .withExposedPorts(exposedPorts); + public GenericContainer installHarperDB(String dockerImgage, final Map envMap, final Integer... exposedPorts) { + return new GenericContainer(dockerImgage).withEnv(envMap) + .withExposedPorts(exposedPorts); } } diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 767d9d971b..42ef04dadf 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -1,6 +1,7 @@ package com.baledung.harperdb; import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; + import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -16,6 +17,7 @@ import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; public class HarperDBLiveTest { + private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); private static String host; @@ -61,40 +63,27 @@ public class HarperDBLiveTest { } private static void insertSubjectRecords() throws IOException { - String records = "[" - + "{\"id\":1, \"name\":\"English\"}," - + "{\"id\":2, \"name\":\"Maths\"}," - + "{\"id\":3, \"name\":\"Science\"}" - + "]"; + String records = "[" + "{\"id\":1, \"name\":\"English\"}," + "{\"id\":2, \"name\":\"Maths\"}," + "{\"id\":3, \"name\":\"Science\"}" + "]"; harperDbApiService.insertRecords("Demo", "Subject", records); } - private static void insertTeacherRecords() throws IOException { - String records = "[" + - "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," - + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," - + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," - + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," - + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," - + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" - + "]"; + private static void insertTeacherRecords() throws IOException { + String records = "[" + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + + "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher", records); } private static void insertTeacherDetailsRecords() throws IOException { - String records = "[" - + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," - + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," - + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," - + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," - + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," - + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," - + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," - + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," - + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," - + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" - + "]"; + String records = "[" + "{\"id\":1, \"teacher_id\":1, \"subject_id\":1}," + "{\"id\":2, \"teacher_id\":1, \"subject_id\":2}," + + "{\"id\":3, \"teacher_id\":2, \"subject_id\":3 }," + "{\"id\":4, \"teacher_id\":3, \"subject_id\":1}," + + "{\"id\":5, \"teacher_id\":3, \"subject_id\":3}," + "{\"id\":6, \"teacher_id\":4, \"subject_id\":2}," + + "{\"id\":7, \"teacher_id\":5, \"subject_id\":3}," + "{\"id\":8, \"teacher_id\":6, \"subject_id\":1}," + + "{\"id\":9, \"teacher_id\":6, \"subject_id\":2}," + "{\"id\":15, \"teacher_id\":6, \"subject_id\":3}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher_Details", records); } @@ -110,7 +99,8 @@ public class HarperDBLiveTest { final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; try (Connection connection = DriverManager.getConnection(JDBC_URL)) { - connection.createStatement().executeQuery("select 1"); + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Successful"); } }); @@ -125,7 +115,8 @@ public class HarperDBLiveTest { prop.setProperty("Password", "password"); try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { - connection.createStatement().executeQuery("select 1"); + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Successful"); } }); @@ -135,12 +126,13 @@ public class HarperDBLiveTest { void whenConnectionPooling_thenConnectSuccess() throws SQLException { assertDoesNotThrow(() -> { HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); - final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port - + ";User=admin;Password=password;"; + final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;"; harperdbPoolDataSource.setURL(JDBC_URL); - try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { - connection.createStatement().executeQuery("select 1"); + try (Connection connection = harperdbPoolDataSource.getPooledConnection() + .getConnection()) { + connection.createStatement() + .executeQuery("select 1"); logger.info("Connection Pool Successful"); } }); @@ -155,7 +147,7 @@ public class HarperDBLiveTest { void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name, grade from Demo.student"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(SQL_QUERY); while (resultSet.next()) { @@ -172,7 +164,7 @@ public class HarperDBLiveTest { void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); } @@ -180,11 +172,11 @@ public class HarperDBLiveTest { @Test void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date) " - + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; + final String INSERT_SQL = + "insert into Demo.teacher(id, name, joining_date) " + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); @@ -204,7 +196,7 @@ public class HarperDBLiveTest { void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); assertEquals(1, statement.getUpdateCount()); @@ -215,7 +207,7 @@ public class HarperDBLiveTest { void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { final String DELETE_SQL = "delete from Demo.student where id = 3"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); assertEquals(1, statement.getUpdateCount()); @@ -226,27 +218,27 @@ public class HarperDBLiveTest { void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Robin"); + preparedStatement.setInt(2, 4); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + int grade = resultSet.getInt("grade"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Robin", name); + logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); + } + } } @Test void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { final String DELETE_SQL = "delete from Demo.student where name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); preparedStatement.setString(1, "James"); assertDoesNotThrow(() -> preparedStatement.execute()); @@ -258,7 +250,7 @@ public class HarperDBLiveTest { void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); preparedStatement.setInt(1, 5); preparedStatement.setInt(2, 1); @@ -270,10 +262,9 @@ public class HarperDBLiveTest { //@Test void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" - + "values(?, ?, ?, ?)"; + final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + "values(?, ?, ?, ?)"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); preparedStatement.setInt(1, 9); preparedStatement.setString(2, "Bret Lee"); @@ -292,23 +283,19 @@ public class HarperDBLiveTest { } } - @Test void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { - final String JOIN_QUERY = "SELECT t.name as teacher_name, s.name as subject_name " + - "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; + final String JOIN_QUERY = + "SELECT t.name as teacher_name, s.name as subject_name " + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(JOIN_QUERY); while (resultSet.next()) { - logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" - + resultSet.getString("subject_name")); + logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + resultSet.getString("subject_name")); } - } } @@ -316,7 +303,7 @@ public class HarperDBLiveTest { @Test void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { final String CREATE_TABLE_SQL = "CreateTable"; - try(Connection connection = getConnection()) { + try (Connection connection = getConnection()) { CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); callableStatement.setString("SchemaName", "prod"); //schema gets created too @@ -326,7 +313,7 @@ public class HarperDBLiveTest { ResultSet resultSet = callableStatement.getResultSet(); - while(resultSet.next()) { + while (resultSet.next()) { String tableCreated = resultSet.getString("Success"); assertEquals("true", tableCreated); logger.info("result of the callable execute:" + tableCreated); From d58102e32c745da8eb903b60aef4ad18e6f3c78f Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:54:21 +0530 Subject: [PATCH 708/831] BAEL-7200 fixed formatting --- .../modifyrequest/aop/EscapeHtmlAspect.java | 14 +++++++++----- .../config/WebMvcConfiguration.java | 3 ++- .../EscapeHtmlRequestWrapper.java | 7 +++---- .../EscapeHtmlAspectIntegrationTest.java | 10 ++++++---- .../EscapeHtmlFilterIntegrationTest.java | 18 ++++++++++-------- .../EscapeHtmlInterceptorIntegrationTest.java | 11 ++++++----- 6 files changed, 36 insertions(+), 27 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java index fb31abe11b..d4533dcf0b 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/aop/EscapeHtmlAspect.java @@ -17,6 +17,7 @@ import java.nio.charset.StandardCharsets; @RestControllerAdvice @Profile("aspectExample") public class EscapeHtmlAspect implements RequestBodyAdvice { + private static final Logger logger = LoggerFactory.getLogger(EscapeHtmlAspect.class); @Override @@ -26,7 +27,8 @@ public class EscapeHtmlAspect implements RequestBodyAdvice { } @Override - public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) throws IOException { + public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, + Class> converterType) throws IOException { logger.info("beforeBodyRead called"); InputStream inputStream = inputMessage.getBody(); return new HttpInputMessage() { @@ -43,13 +45,15 @@ public class EscapeHtmlAspect implements RequestBodyAdvice { } @Override - public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, + Class> converterType) { // Return the modified object after reading the body return body; } @Override - public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, + Class> converterType) { //return the original body return body; } @@ -68,7 +72,7 @@ public class EscapeHtmlAspect implements RequestBodyAdvice { String input = stringBuilder.toString(); // Escape HTML characters return input.replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">"); + .replaceAll("<", "<") + .replaceAll(">", ">"); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java index bd76fd5e55..2fc1fbc310 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/config/WebMvcConfiguration.java @@ -1,6 +1,7 @@ package com.baeldung.modifyrequest.config; import com.baeldung.modifyrequest.interceptor.EscapeHtmlRequestInterceptor; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; @@ -17,7 +18,7 @@ public class WebMvcConfiguration implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { logger.info("addInterceptors() called"); registry.addInterceptor(new EscapeHtmlRequestInterceptor()) - .addPathPatterns("/save"); + .addPathPatterns("/save"); WebMvcConfigurer.super.addInterceptors(registry); } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java index 65c758d956..e7b3abbc1f 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/main/java/com/baeldung/modifyrequest/requestwrapper/EscapeHtmlRequestWrapper.java @@ -27,10 +27,9 @@ public class EscapeHtmlRequestWrapper extends HttpServletRequestWrapper { String input = stringBuilder.toString(); // Escape HTML characters return input.replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - //.replaceAll("\"", """) - .replaceAll("'", "'"); + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll("'", "'"); } @Override diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java index 12520b7e67..ef18591ccb 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlAspectIntegrationTest.java @@ -44,9 +44,11 @@ public class EscapeHtmlAspectIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().isCreated()) - .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status() + .isCreated()) + .andExpect(MockMvcResultMatchers.content() + .json(objectMapper.writeValueAsString(expectedResponseBody))); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java index 3ab7618b05..d84ced5e1a 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java @@ -31,21 +31,23 @@ public class EscapeHtmlFilterIntegrationTest { @Test void givenFilter_whenEscapeHtmlFilter_thenEscapeHtml() throws Exception { Map requestBody = Map.of( - "name", "James Cameron", - "email", "james@gmail.com" + "name", "James Cameron", + "email", "james@gmail.com" ); Map expectedResponseBody = Map.of( - "name", "James Cameron", - "email", "<script>alert()</script>james@gmail.com" + "name", "James Cameron", + "email", "<script>alert()</script>james@gmail.com" ); ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().isCreated()) - .andExpect(MockMvcResultMatchers.content().json(objectMapper.writeValueAsString(expectedResponseBody))); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status() + .isCreated()) + .andExpect(MockMvcResultMatchers.content() + .json(objectMapper.writeValueAsString(expectedResponseBody))); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java index d855339bd9..06aff5db3b 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java @@ -33,14 +33,15 @@ public class EscapeHtmlInterceptorIntegrationTest { @Test void givenInterceptor_whenEscapeHtmlInterceptor_thenEscapeHtml() throws Exception { Map requestBody = Map.of( - "name", "James Cameron", - "email", "james@gmail.com" + "name", "James Cameron", + "email", "james@gmail.com" ); ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status().is4xxClientError()); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))) + .andExpect(MockMvcResultMatchers.status() + .is4xxClientError()); } } From 526a90bc8c8340925f04628eafaa3155077cdd05 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 10:58:12 +0530 Subject: [PATCH 709/831] BAEL-7200 fixed formatting --- .../modifyrequest/EscapeHtmlFilterIntegrationTest.java | 10 ++++------ .../EscapeHtmlInterceptorIntegrationTest.java | 7 +++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java index d84ced5e1a..c813827422 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlFilterIntegrationTest.java @@ -43,11 +43,9 @@ public class EscapeHtmlFilterIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status() - .isCreated()) - .andExpect(MockMvcResultMatchers.content() - .json(objectMapper.writeValueAsString(expectedResponseBody))); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))).andExpect(MockMvcResultMatchers.status() + .isCreated()).andExpect(MockMvcResultMatchers.content() + .json(objectMapper.writeValueAsString(expectedResponseBody))); } } diff --git a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java index 06aff5db3b..9afc7f7e5a 100644 --- a/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java +++ b/spring-boot-modules/spring-boot-mvc-5/src/test/java/com/baeldung/modifyrequest/EscapeHtmlInterceptorIntegrationTest.java @@ -39,9 +39,8 @@ public class EscapeHtmlInterceptorIntegrationTest { ObjectMapper objectMapper = new ObjectMapper(); mockMvc.perform(MockMvcRequestBuilders.post(URI.create("/save")) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestBody))) - .andExpect(MockMvcResultMatchers.status() - .is4xxClientError()); + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestBody))).andExpect(MockMvcResultMatchers.status() + .is4xxClientError()); } } From 367e9e6c2a0c332b774320bef8ee8818a3fce200 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Mon, 27 Nov 2023 08:45:03 +0100 Subject: [PATCH 710/831] Assert the solution --- .../ShiftScheduleConstraintProviderUnitTest.java | 2 +- .../timefoldsolver/ShiftScheduleSolverUnitTest.java | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 3f68ef701e..fbe6ebccaf 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -21,7 +21,7 @@ class ShiftScheduleConstraintProviderUnitTest { constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead. + // To avoid that, use forEachUniquePair() in the constraint instead of forEach().join() in the implementation. .penalizesBy(2); } diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index 45a84b40da..8b57fb42b6 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -1,5 +1,7 @@ package com.baeldung.timefoldsolver; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + import java.time.Duration; import java.time.LocalDate; import java.util.List; @@ -23,13 +25,17 @@ public class ShiftScheduleSolverUnitTest { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) - // The solver runs only for 2 seconds on this tiny dataset. - // It's recommended to run for at least 5 minutes ("5m") on large datasets. - .withTerminationSpentLimit(Duration.ofSeconds(2))); + // For this dataset, we know the optimal score in advance (which is normally not the case). + // So we can use .withBestScoreLimit() instead of .withTerminationSpentLimit(). + .withTerminationConfig(new TerminationConfig().withBestScoreLimit("0hard/0soft"))); Solver solver = solverFactory.buildSolver(); ShiftSchedule problem = loadProblem(); ShiftSchedule solution = solver.solve(problem); + assertThat(solution.getShifts().size()).isNotZero(); + for (Shift shift : solution.getShifts()) { + assertThat(shift.getEmployee()).isNotNull(); + } printSolution(solution); } From a0b5fb344309cd0a23b05ab119f4b9ffb937811d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:14:38 +0200 Subject: [PATCH 711/831] [JAVA-27545] Upgraded spring-jinq to spring-boot 3 (#15300) --- spring-jinq/pom.xml | 12 +++++++++--- .../jinq/config/JinqProviderConfiguration.java | 2 +- .../com/baeldung/spring/jinq/entities/Car.java | 16 +++++++++------- .../spring/jinq/entities/Manufacturer.java | 11 +++++------ .../repositories/BaseJinqRepositoryImpl.java | 4 ++-- .../java/com/baeldung/SpringContextTest.java | 1 - 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/spring-jinq/pom.xml b/spring-jinq/pom.xml index 14ac366e74..c1dee7fa9f 100644 --- a/spring-jinq/pom.xml +++ b/spring-jinq/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 @@ -35,6 +35,11 @@ org.springframework spring-orm + + org.hibernate.orm + hibernate-core + ${hibernate-core.version} + org.springframework.boot @@ -58,7 +63,8 @@ - 1.8.29 + 2.0.1 + 6.4.0.Final \ No newline at end of file diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java index 6d921045b7..01e16cf0f7 100644 --- a/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java @@ -1,6 +1,6 @@ package com.baeldung.spring.jinq.config; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import org.jinq.jpa.JinqJPAStreamProvider; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java index 263e6c7622..a0b9620629 100644 --- a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java @@ -1,19 +1,23 @@ package com.baeldung.spring.jinq.entities; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; + + @Entity(name = "CAR") public class Car { + @Id private String model; private String description; private int year; private String engine; + @ManyToOne + @JoinColumn(name = "name") private Manufacturer manufacturer; - @Id public String getModel() { return model; } @@ -46,8 +50,6 @@ public class Car { this.engine = engine; } - @OneToOne - @JoinColumn(name = "name") public Manufacturer getManufacturer() { return manufacturer; } diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java index f6e5fd23de..0021e45658 100644 --- a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java @@ -2,18 +2,19 @@ package com.baeldung.spring.jinq.entities; import java.util.List; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; @Entity(name = "MANUFACTURER") public class Manufacturer { + @Id private String name; private String city; + @OneToMany(mappedBy = "model") private List cars; - @Id public String getName() { return name; } @@ -30,7 +31,6 @@ public class Manufacturer { this.city = city; } - @OneToMany(mappedBy = "model") public List getCars() { return cars; } @@ -38,5 +38,4 @@ public class Manufacturer { public void setCars(List cars) { this.cars = cars; } - } diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java index 42b81ecc59..e85231f537 100644 --- a/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java @@ -1,7 +1,7 @@ package com.baeldung.spring.jinq.repositories; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.jinq.jpa.JPAJinqStream; import org.jinq.jpa.JinqJPAStreamProvider; diff --git a/spring-jinq/src/test/java/com/baeldung/SpringContextTest.java b/spring-jinq/src/test/java/com/baeldung/SpringContextTest.java index 1a486d1003..7c65a831c4 100644 --- a/spring-jinq/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-jinq/src/test/java/com/baeldung/SpringContextTest.java @@ -4,7 +4,6 @@ import com.baeldung.spring.jinq.JinqApplication; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import com.baeldung.spring.jinq.JinqApplication; @SpringBootTest(classes = JinqApplication.class) public class SpringContextTest { From 8548b42b8483a9be917303c72d680da7730825f7 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 27 Nov 2023 01:40:35 -0800 Subject: [PATCH 712/831] JAVA-27792 Move atomikos module to persistence-modules (#15301) --- {atomikos => persistence-modules/atomikos}/README.md | 0 {atomikos => persistence-modules/atomikos}/pom.xml | 2 +- .../src/main/java/com/baeldung/atomikos/direct/Application.java | 0 .../src/main/java/com/baeldung/atomikos/spring/Application.java | 0 .../main/java/com/baeldung/atomikos/spring/config/Config.java | 0 .../main/java/com/baeldung/atomikos/spring/jpa/Application.java | 0 .../java/com/baeldung/atomikos/spring/jpa/config/Config.java | 0 .../com/baeldung/atomikos/spring/jpa/inventory/Inventory.java | 0 .../baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java | 0 .../atomikos/spring/jpa/inventory/InventoryRepository.java | 0 .../main/java/com/baeldung/atomikos/spring/jpa/order/Order.java | 0 .../com/baeldung/atomikos/spring/jpa/order/OrderConfig.java | 0 .../com/baeldung/atomikos/spring/jpa/order/OrderRepository.java | 0 .../atomikos}/src/main/resources/logback.xml | 0 .../atomikos}/src/main/resources/schema.sql | 0 .../atomikos}/src/main/resources/transactions.properties | 0 .../java/com/baeldung/atomikos/direct/ApplicationUnitTest.java | 0 .../java/com/baeldung/atomikos/spring/ApplicationUnitTest.java | 0 .../com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java | 0 .../atomikos}/src/test/resources/logback.xml | 0 .../atomikos}/src/test/resources/transactions.properties | 0 persistence-modules/pom.xml | 1 + pom.xml | 2 -- 23 files changed, 2 insertions(+), 3 deletions(-) rename {atomikos => persistence-modules/atomikos}/README.md (100%) rename {atomikos => persistence-modules/atomikos}/pom.xml (98%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/direct/Application.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/Application.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/config/Config.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java (100%) rename {atomikos => persistence-modules/atomikos}/src/main/resources/logback.xml (100%) rename {atomikos => persistence-modules/atomikos}/src/main/resources/schema.sql (100%) rename {atomikos => persistence-modules/atomikos}/src/main/resources/transactions.properties (100%) rename {atomikos => persistence-modules/atomikos}/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java (100%) rename {atomikos => persistence-modules/atomikos}/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java (100%) rename {atomikos => persistence-modules/atomikos}/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java (100%) rename {atomikos => persistence-modules/atomikos}/src/test/resources/logback.xml (100%) rename {atomikos => persistence-modules/atomikos}/src/test/resources/transactions.properties (100%) diff --git a/atomikos/README.md b/persistence-modules/atomikos/README.md similarity index 100% rename from atomikos/README.md rename to persistence-modules/atomikos/README.md diff --git a/atomikos/pom.xml b/persistence-modules/atomikos/pom.xml similarity index 98% rename from atomikos/pom.xml rename to persistence-modules/atomikos/pom.xml index 2cbc106268..c1748f7dac 100644 --- a/atomikos/pom.xml +++ b/persistence-modules/atomikos/pom.xml @@ -8,7 +8,7 @@ com.baeldung - parent-modules + persistence-modules 1.0.0-SNAPSHOT diff --git a/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/direct/Application.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/Application.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryRepository.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java diff --git a/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java similarity index 100% rename from atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java rename to persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderRepository.java diff --git a/atomikos/src/main/resources/logback.xml b/persistence-modules/atomikos/src/main/resources/logback.xml similarity index 100% rename from atomikos/src/main/resources/logback.xml rename to persistence-modules/atomikos/src/main/resources/logback.xml diff --git a/atomikos/src/main/resources/schema.sql b/persistence-modules/atomikos/src/main/resources/schema.sql similarity index 100% rename from atomikos/src/main/resources/schema.sql rename to persistence-modules/atomikos/src/main/resources/schema.sql diff --git a/atomikos/src/main/resources/transactions.properties b/persistence-modules/atomikos/src/main/resources/transactions.properties similarity index 100% rename from atomikos/src/main/resources/transactions.properties rename to persistence-modules/atomikos/src/main/resources/transactions.properties diff --git a/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java b/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java similarity index 100% rename from atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java rename to persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/direct/ApplicationUnitTest.java diff --git a/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java b/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java similarity index 100% rename from atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java rename to persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/ApplicationUnitTest.java diff --git a/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java b/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java similarity index 100% rename from atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java rename to persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java diff --git a/atomikos/src/test/resources/logback.xml b/persistence-modules/atomikos/src/test/resources/logback.xml similarity index 100% rename from atomikos/src/test/resources/logback.xml rename to persistence-modules/atomikos/src/test/resources/logback.xml diff --git a/atomikos/src/test/resources/transactions.properties b/persistence-modules/atomikos/src/test/resources/transactions.properties similarity index 100% rename from atomikos/src/test/resources/transactions.properties rename to persistence-modules/atomikos/src/test/resources/transactions.properties diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 6823b460b2..d9ee7e358c 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -18,6 +18,7 @@ apache-bookkeeper apache-cayenne apache-derby + atomikos blaze-persistence core-java-persistence core-java-persistence-2 diff --git a/pom.xml b/pom.xml index 3452ae81ee..c6abc0d4d8 100644 --- a/pom.xml +++ b/pom.xml @@ -710,7 +710,6 @@ apache-velocity asciidoctor asm - atomikos atomix aws-modules azure @@ -955,7 +954,6 @@ apache-velocity asciidoctor asm - atomikos atomix aws-modules azure From 2e6b17b85336d0338afb8426ae53188812407edc Mon Sep 17 00:00:00 2001 From: gaepi Date: Mon, 27 Nov 2023 11:31:41 +0100 Subject: [PATCH 713/831] JAVA-27656 | spring-boot-modules fix --- .../baeldung/caffeine/SecurityConfiguration.java | 13 +++++++------ .../boot/management/logging/SecurityConfig.java | 14 ++++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/caffeine/SecurityConfiguration.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/caffeine/SecurityConfiguration.java index 7f3ad7988f..e63726c926 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/caffeine/SecurityConfiguration.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/caffeine/SecurityConfiguration.java @@ -1,9 +1,10 @@ package com.baeldung.caffeine; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; /** * Because the POM imports Spring Security, we need a simple security @@ -11,14 +12,14 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur */ @Configuration @EnableWebSecurity -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain securityFilter(HttpSecurity http) throws Exception { http.csrf().disable(); - http.authorizeRequests() + return http.authorizeRequests() .antMatchers("/**") - .permitAll(); + .permitAll().and().build(); } } diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java index 45cc1ebb33..6870f4e6bb 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java +++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java @@ -1,14 +1,16 @@ package com.baeldung.spring.boot.management.logging; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf() - .ignoringAntMatchers("/actuator/**"); +public class SecurityConfig { + @Bean + public SecurityFilterChain securityFilter(HttpSecurity http) throws Exception { + return http.csrf() + .ignoringAntMatchers("/actuator/**").and() + .build(); } } From 8dd4651db582818e56bcd2c812ee76ef8996db47 Mon Sep 17 00:00:00 2001 From: gaepi Date: Mon, 27 Nov 2023 11:48:10 +0100 Subject: [PATCH 714/831] JAVA-27656 | removing WebSecurityConfigurerAdapter from spring-web-modules/spring-thymeleaf --- .../thymeleaf/config/WebMVCSecurity.java | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java index ea51ca3cd9..074cc20be1 100644 --- a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java +++ b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/config/WebMVCSecurity.java @@ -2,42 +2,37 @@ package com.baeldung.thymeleaf.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) -public class WebMVCSecurity extends WebSecurityConfigurerAdapter { +public class WebMVCSecurity { @Bean - @Override - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user1") + .password("{noop}user1Pass") + .authorities("USER") + .build(); + return new InMemoryUserDetailsManager(user); } - public WebMVCSecurity() { - super(); + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.ignoring().antMatchers("/resources/**"); } - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication().withUser("user1").password("{noop}user1Pass").authorities("ROLE_USER"); - } - - @Override - public void configure(final WebSecurity web) throws Exception { - web.ignoring().antMatchers("/resources/**"); - } - - @Override - protected void configure(final HttpSecurity http) throws Exception { - http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); + @Bean + public SecurityFilterChain filterChain(final HttpSecurity http) throws Exception { + return http.authorizeRequests().anyRequest().authenticated().and().httpBasic().and().build(); } } From 4151b9ce706ae13764d445df9c28d28f8488ecb3 Mon Sep 17 00:00:00 2001 From: gaepi Date: Mon, 27 Nov 2023 12:00:26 +0100 Subject: [PATCH 715/831] JAVA-27656 | removing WebSecurityConfigurerAdapter --- .../OAuth2WebSecurityConfigurerAdapter.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/oauthfeign/OAuth2WebSecurityConfigurerAdapter.java b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/oauthfeign/OAuth2WebSecurityConfigurerAdapter.java index af60c3849b..6efacc03b1 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/oauthfeign/OAuth2WebSecurityConfigurerAdapter.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/oauthfeign/OAuth2WebSecurityConfigurerAdapter.java @@ -1,19 +1,23 @@ package com.baeldung.cloud.openfeign.oauthfeign; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class OAuth2WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { +public class OAuth2WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf() .disable() .oauth2Client(); + http .authorizeRequests().anyRequest().permitAll(); + + return http.build(); } } From cf74ed5628699d725c5994604a60c33b03d64d8f Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Mon, 27 Nov 2023 13:15:33 +0200 Subject: [PATCH 716/831] [JAVA-27818] --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c6abc0d4d8..f5aedd091e 100644 --- a/pom.xml +++ b/pom.xml @@ -701,7 +701,7 @@ apache-kafka apache-libraries-2 apache-libraries - apache-olingo + apache-olingo apache-poi-2 apache-poi-3 apache-poi @@ -945,7 +945,7 @@ apache-kafka apache-libraries-2 apache-libraries - apache-olingo + apache-olingo apache-poi-2 apache-poi-3 apache-poi From e78928e37646d2aef20118dc2c27e42cc89ea4d1 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:15:25 +0200 Subject: [PATCH 717/831] Update JsonNodeToJsonObjectUnitTest.java --- .../jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java index e5a12869ea..38d097e5b8 100644 --- a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java +++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import static org.junit.Assert.*; public class JsonNodeToJsonObjectUnitTest { + public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}"; @Test From 43fd0973ddeec97155f6c787336d05e05d0f8144 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Mon, 27 Nov 2023 23:15:13 +0530 Subject: [PATCH 718/831] BAEL-7259 --- .../baledung/harperdb/HarperDBLiveTest.java | 349 +++++++++--------- 1 file changed, 177 insertions(+), 172 deletions(-) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 42ef04dadf..1cd377dc6d 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -12,6 +12,7 @@ import org.testcontainers.containers.GenericContainer; import java.io.IOException; import java.net.URISyntaxException; import java.sql.*; +import java.util.Arrays; import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; @@ -63,18 +64,22 @@ public class HarperDBLiveTest { } private static void insertSubjectRecords() throws IOException { - String records = "[" + "{\"id\":1, \"name\":\"English\"}," + "{\"id\":2, \"name\":\"Maths\"}," + "{\"id\":3, \"name\":\"Science\"}" + "]"; + String records = "[" + + "{\"id\":1, \"name\":\"English\"}," + + "{\"id\":2, \"name\":\"Maths\"}," + + "{\"id\":3, \"name\":\"Science\"}" + + "]"; harperDbApiService.insertRecords("Demo", "Subject", records); } private static void insertTeacherRecords() throws IOException { - String records = "[" + "{\"id\":1, \"name\":\"Parthiv Pradhan\", \"joining_date\":\"04-05-2000\"}," + - "{\"id\":2, \"name\":\"David Martinez\", \"joining_date\":\"20-10-2005\"}," + - "{\"id\":3, \"name\":\"Liam Williams\", \"joining_date\":\"04-06-1997\"}," + + String records = "[" + "{\"id\":1, \"name\":\"James Cameron\", \"joining_date\":\"04-05-2000\"}," + + "{\"id\":2, \"name\":\"Joe Biden\", \"joining_date\":\"20-10-2005\"}," + + "{\"id\":3, \"name\":\"Jessie Williams\", \"joining_date\":\"04-06-1997\"}," + "{\"id\":4, \"name\":\"Robin Williams\", \"joining_date\":\"01-01-2020\"}," + - "{\"id\":5, \"name\":\"Eric Martin\", \"joining_date\":\"04-05-2022\"}," + - "{\"id\":6, \"name\":\"Sajjan Nagendra\", \"joining_date\":\"02-02-1999\"}" + "]"; + "{\"id\":5, \"name\":\"Eric Johnson\", \"joining_date\":\"04-05-2022\"}," + + "{\"id\":6, \"name\":\"Raghu Yadav\", \"joining_date\":\"02-02-1999\"}" + "]"; harperDbApiService.insertRecords("Demo", "Teacher", records); } @@ -138,175 +143,13 @@ public class HarperDBLiveTest { }); } - private static Connection getConnection() throws SQLException { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - return DriverManager.getConnection(URL); - } - - @Test - void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from Demo.student"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(SQL_QUERY); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.student(id, name, grade) values (10, 'Barak', 3)"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - } - } - - @Test - void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = - "insert into Demo.teacher(id, name, joining_date) " + "values (7, 'David Sirocco', '04-05-2004'), (8, 'Ali Azmat', '04-10-2000')"; - final String QUERY_SQL = "select name, joining_date from Demo.teacher where name = ?"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); - preparedStatement.setString(1, "David Sirocco"); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - String teacherName = resultSet.getString("name"); - String joinDate = resultSet.getString("joining_date"); - assertEquals("David Sirocco", teacherName); - assertEquals("04-05-2004", joinDate); - logger.info("name:" + teacherName + " joining date:" + joinDate); - } - } - } - - @Test - void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update Demo.student set grade = 4 where id = 5"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from Demo.student where id = 3"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from Demo.student where name = ? and grade = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from Demo.student where name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); - preparedStatement.setString(1, "James"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update Demo.student set grade = ? where id = ? and name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); - preparedStatement.setInt(1, 5); - preparedStatement.setInt(2, 1); - preparedStatement.setString(3, "John"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - //@Test - void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into Demo.teacher(id, name, joining_date, subject_id)" + "values(?, ?, ?, ?)"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); - preparedStatement.setInt(1, 9); - preparedStatement.setString(2, "Bret Lee"); - preparedStatement.setString(3, "07-08-2002"); - preparedStatement.setString(4, "[1, 3]"); - preparedStatement.addBatch(); - - preparedStatement.setInt(1, 10); - preparedStatement.setString(2, "Sarah Glimmer"); - preparedStatement.setString(3, "07-08-1997"); - preparedStatement.setString(4, "[1, 2]"); - - preparedStatement.addBatch(); - - assertDoesNotThrow(() -> preparedStatement.executeBatch()); - } - } - - @Test - void whenExecuteJoinQuery_thenResultSuccess() throws SQLException { - final String JOIN_QUERY = - "SELECT t.name as teacher_name, s.name as subject_name " + "from Demo.teacher AS t INNER JOIN Demo.subject AS s ON t.subject_id = s.id"; - - try (Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - - ResultSet resultSet = statement.executeQuery(JOIN_QUERY); - while (resultSet.next()) { - logger.info("Teacher Name:" + resultSet.getString("teacher_name") + " Subject Name:" + resultSet.getString("subject_name")); - } - - } - - } - @Test void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { - final String CREATE_TABLE_SQL = "CreateTable"; + final String CREATE_TABLE_PROC = "CreateTable"; try (Connection connection = getConnection()) { - CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); + CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_PROC); - callableStatement.setString("SchemaName", "prod"); //schema gets created too + callableStatement.setString("SchemaName", "prod"); callableStatement.setString("TableName", "subject"); callableStatement.setString("PrimaryKey", "id"); Boolean result = callableStatement.execute(); @@ -316,8 +159,170 @@ public class HarperDBLiveTest { while (resultSet.next()) { String tableCreated = resultSet.getString("Success"); assertEquals("true", tableCreated); - logger.info("result of the callable execute:" + tableCreated); + logger.info("Table Created Successfully"); } } } + + @Test + void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.Subject(id, name) values " + + "(4, 'Social Studies')," + + "(5, 'Geography')"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); + assertEquals(2, statement.getUpdateCount()); + } + } + @Test + void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException { + final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values" + + "(?, ?, ?)"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); + preparedStatement.setInt(1, 7); + preparedStatement.setString(2, "Bret Lee"); + preparedStatement.setString(3, "07-08-2002"); + preparedStatement.addBatch(); + + preparedStatement.setInt(1, 8); + preparedStatement.setString(2, "Sarah Glimmer"); + preparedStatement.setString(3, "07-08-1997"); + preparedStatement.addBatch(); + + int[] recordsInserted = preparedStatement.executeBatch(); + + assertEquals(2, Arrays.stream(recordsInserted).sum()); + } + } + + + private static Connection getConnection() throws SQLException { + String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; + return DriverManager.getConnection(URL); + } + + @Test + void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(SQL_QUERY); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Maths", name); + logger.info("Subject id:" + id + " Subject Name:" + name); + } + } + } + + @Test + void givenPreparedStatement_whenExecuteJoinQuery_thenSuccess() throws SQLException { + final String JOIN_QUERY = "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name " + + "from Demo.Teacher_Details AS td " + + "INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id " + + "INNER JOIN Demo.Subject AS s on s.id = td.subject_id " + + "where t.name = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(JOIN_QUERY); + preparedStatement.setString(1, "Eric Johnson"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String teacherName = resultSet.getString("teacher_name"); + String subjectName = resultSet.getString("subject_name"); + String joiningDate = resultSet.getString("joining_date"); + assertEquals("Eric Johnson", teacherName); + assertEquals("Maths", subjectName); + logger.info("Teacher Name:" + teacherName + " Subject Name:" + subjectName + " Joining Date:" + joiningDate); + } + } + } + @Test + void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { + final String SQL_QUERY = "select id, name from Demo.Subject where name = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); + preparedStatement.setString(1, "Maths"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + int id = resultSet.getInt("id"); + String name = resultSet.getString("name"); + assertNotNull(Integer.valueOf(id)); + assertEquals("Maths", name); + logger.info("Subject id:" + id + " Subject Name:" + name); + } + } + } + + + @Test + void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = 2 " + + "where teacher_id in (2, 5)"; + final String UPDATE_SQL_WITH_SUB_QUERY = "update Demo.Teacher_Details " + + "set subject_id = (select id from Demo.Subject where name = 'Maths') " + + "where teacher_id in (select id from Demo.Teacher where name in ('Joe Biden', 'Eric Johnson'))"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); + assertEquals(2, statement.getUpdateCount()); + } + + try (Connection connection = getConnection()) { + assertThrows(SQLException.class, () -> connection.createStatement().execute(UPDATE_SQL_WITH_SUB_QUERY)); + } + } + + @Test + void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { + final String UPDATE_SQL = "update Demo.Teacher_Details set subject_id = ? " + + "where teacher_id in (?, ?)"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); + preparedStatement.setInt(1, 1); + //following is not supported by the HarperDB driver + //Integer[] teacherIds = {4, 5}; + //Array teacherIdArray = connection.createArrayOf(Integer.class.getTypeName(), teacherIds); + preparedStatement.setInt(2, 4); + preparedStatement.setInt(3, 5); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(2, preparedStatement.getUpdateCount()); + } + } + + @Test + void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = 6 and subject_id = 3"; + + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); + assertEquals(1, statement.getUpdateCount()); + } + } + + @Test + void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { + final String DELETE_SQL = "delete from Demo.Teacher_Details where teacher_id = ? and subject_id = ?"; + + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); + preparedStatement.setInt(1, 6); + preparedStatement.setInt(2, 2); + assertDoesNotThrow(() -> preparedStatement.execute()); + assertEquals(1, preparedStatement.getUpdateCount()); + } + } } From 6164b9c0bafd9fe7080d0429c3a1af07ea5ebf35 Mon Sep 17 00:00:00 2001 From: Sameer Date: Tue, 28 Nov 2023 03:47:00 +0530 Subject: [PATCH 719/831] string vs stringBuffer comparison (#15306) Co-authored-by: Sahil --- .../stringbuffer/ComparePerformance.java | 63 +++++++++++++++++++ .../com/baeldung/stringbuffer/HashCode.java | 24 +++++++ .../stringIterator/StringIteratorTest.java | 4 +- .../stringbuffer/ComparePerformanceTest.java | 32 ++++++++++ .../baeldung/stringbuffer/HashCodeTest.java | 24 +++++++ 5 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java create mode 100644 core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/HashCode.java create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/ComparePerformanceTest.java create mode 100644 core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/HashCodeTest.java diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java new file mode 100644 index 0000000000..28cd2e64e9 --- /dev/null +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java @@ -0,0 +1,63 @@ +package com.baeldung.stringbuffer; + +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.SingleShotTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Measurement(batchSize = 10000, iterations = 10) +@Warmup(batchSize = 1000, iterations = 10) +@State(Scope.Thread) +public class ComparePerformance { + + String strInitial = "springframework"; + String strFinal = ""; + String replacement = "java-"; + + @Benchmark + public String benchmarkStringConcatenation() { + strFinal += strInitial; + return strFinal; + } + + @Benchmark + public StringBuffer benchmarkStringBufferConcatenation() { + StringBuffer stringBuffer = new StringBuffer(strFinal); + stringBuffer.append(strInitial); + return stringBuffer; + } + + @Benchmark + public String benchmarkStringReplacement() { + strFinal = strInitial.replaceFirst("spring", replacement); + return strFinal; + } + + @Benchmark + public StringBuffer benchmarkStringBufferReplacement() { + StringBuffer stringBuffer = new StringBuffer(strInitial); + stringBuffer.replace(0,6, replacement); + return stringBuffer; + } + + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder() + .include(ComparePerformance.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server").build(); + new Runner(options).run(); + } +} diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/HashCode.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/HashCode.java new file mode 100644 index 0000000000..65f17263a9 --- /dev/null +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/HashCode.java @@ -0,0 +1,24 @@ +package com.baeldung.stringbuffer; + +public class HashCode { + + public static long getHashCodeString(String string) { + return string.hashCode(); + } + + public static long getHashCodeSBuffer(StringBuffer strBuff) { + return strBuff.hashCode(); + } + + public static void main(String[] args) { + String str = "Spring"; + System.out.println("String HashCode pre concatenation :" + getHashCodeString(str)); + str += "Framework"; + System.out.println("String HashCode post concatenation :" + getHashCodeString(str)); + + StringBuffer sBuf = new StringBuffer("Spring"); + System.out.println("StringBuffer HashCode pre concatenation :" + getHashCodeSBuffer(sBuf)); + sBuf.append("Framework"); + System.out.println("StringBuffer HashCode post concatenation :" + getHashCodeSBuffer(sBuf)); + } +} diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java index 585d65d4be..aef7f81da2 100644 --- a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringIterator/StringIteratorTest.java @@ -17,7 +17,7 @@ public class StringIteratorTest { public void whenUseJavaForLoop_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; - String result = StringIterator.javaForLoop(input); + String result = StringIterator.javaforLoop(input); assertEquals(expectedOutput, result); } @@ -25,7 +25,7 @@ public class StringIteratorTest { public void whenUseForEachMethod_thenIterate() { String input = "Hello, Baeldung!"; String expectedOutput = "Hello, Baeldung!"; - String result = StringIterator.java8ForEach(input); + String result = StringIterator.java8forEach(input); assertEquals(expectedOutput, result); } diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/ComparePerformanceTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/ComparePerformanceTest.java new file mode 100644 index 0000000000..696c4bae6b --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/ComparePerformanceTest.java @@ -0,0 +1,32 @@ +package com.baeldung.stringbuffer; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + + +public class ComparePerformanceTest { + + ComparePerformance cp = new ComparePerformance(); + + @Test + public void whenStringConcatenated_thenResultAsExpected() { + assertThat(cp.benchmarkStringConcatenation()).isEqualTo("springframework"); + } + + @Test + public void whenStringBufferConcatenated_thenResultAsExpected() { + StringBuffer stringBuffer = new StringBuffer("springframework"); + assertThat(cp.benchmarkStringBufferConcatenation()).isEqualToIgnoringCase(stringBuffer); + } + + @Test + public void whenStringReplaced_thenResultAsExpected() { + assertThat(cp.benchmarkStringReplacement()).isEqualTo("java-framework"); + } + + @Test + public void whenStringBufferReplaced_thenResultAsExpected() { + StringBuffer stringBuffer = new StringBuffer("java-framework"); + assertThat(cp.benchmarkStringBufferReplacement()).isEqualToIgnoringCase(stringBuffer); + } +} diff --git a/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/HashCodeTest.java b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/HashCodeTest.java new file mode 100644 index 0000000000..265c4e1e40 --- /dev/null +++ b/core-java-modules/core-java-strings/src/test/java/com/baeldung/stringbuffer/HashCodeTest.java @@ -0,0 +1,24 @@ +package com.baeldung.stringbuffer; + +import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class HashCodeTest { + + String str = "Spring"; + StringBuffer sBuf = new StringBuffer("Spring"); + + @Test + public void whenStringConcat_thenHashCodeChanges() { + HashCode hc = new HashCode(); + + long initialStringHashCode = hc.getHashCodeString(str); + long initialSBufHashCode = hc.getHashCodeSBuffer(sBuf); + + str += "Framework"; + sBuf.append("Framework"); + + assertThat(initialStringHashCode).isNotEqualTo(hc.getHashCodeString(str)); + assertThat(initialSBufHashCode).isEqualTo(hc.getHashCodeSBuffer(sBuf)); + } +} From 50de40daa27f61c0e5ba52d6c2d11f6e93a6c8a6 Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 28 Nov 2023 10:19:27 +0800 Subject: [PATCH 720/831] Unit Testing for CompletableFuture class --- .../CompletableFutureTest.java | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java new file mode 100644 index 0000000000..25e8ea4c81 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java @@ -0,0 +1,150 @@ +package com.baeldung.concurrent.completablefuture; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class CompletableFutureTest { + + @Test + public void givenAsyncTask_whenProcessingAsyncSucceed_thenReturnSuccess() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello")); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("World")); + + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + + String result = resultFuture.get(); + assertEquals("HelloWorld", result); + } + + @Test + public void givenAsyncTask_whenProcessingAsyncWithException_thenReturnException() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.completedFuture("Hello")); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.failedFuture(new RuntimeException("Simulated Exception"))); + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + // Use assertThrows to verify that the expected exception is thrown + ExecutionException exception = assertThrows(ExecutionException.class, resultFuture::get); + // Assert the exception message + assertEquals("Simulated Exception", exception.getCause() + .getMessage()); + } + + @Test + public void givenAsyncTask_whenProcessingAsyncWithTimeout_thenHandleTimeoutException() throws ExecutionException, InterruptedException { + Microservice mockMicroserviceA = mock(Microservice.class); + Microservice mockMicroserviceB = mock(Microservice.class); + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + when(mockMicroserviceA.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor)); + Executor delayedExecutor2 = CompletableFuture.delayedExecutor(500, TimeUnit.MILLISECONDS); + when(mockMicroserviceB.retrieveAsync(any())).thenReturn(CompletableFuture.supplyAsync(() -> "World", delayedExecutor2)); + CompletableFuture resultFuture = processAsync(List.of(mockMicroserviceA, mockMicroserviceB)); + assertThrows(TimeoutException.class, () -> resultFuture.get(300, TimeUnit.MILLISECONDS)); + } + + @Test + public void givenCompletableFuture_whenCompleted_thenStateIsDone() { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World"); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + + CompletableFuture allCf = CompletableFuture.allOf(cfs); + + assertFalse(allCf.isDone()); + allCf.join(); + String result = Arrays.stream(cfs) + .map(CompletableFuture::join) + .collect(Collectors.joining()); + + assertFalse(allCf.isCancelled()); + assertTrue(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + assertEquals(result, "Hello World!"); + } + + @Test + public void givenCompletableFuture_whenCompletedWithException_thenStateIsCompletedExceptionally() throws ExecutionException, InterruptedException { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.failedFuture(new RuntimeException("Simulated Exception")); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + + CompletableFuture allCf = CompletableFuture.allOf(cfs); + + assertFalse(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + + // Exception is expected, assert the cause + CompletionException exception = assertThrows(CompletionException.class, allCf::join); + + assertEquals("Simulated Exception", exception.getCause() + .getMessage()); + assertTrue(allCf.isCompletedExceptionally()); + assertTrue(allCf.isDone()); + assertFalse(allCf.isCancelled()); + } + + @Test + public void givenCompletableFuture_whenCancelled_thenStateIsCancelled() throws ExecutionException, InterruptedException { + Executor delayedExecutor = CompletableFuture.delayedExecutor(200, TimeUnit.MILLISECONDS); + CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> "Hello", delayedExecutor); + CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> " World"); + CompletableFuture cf3 = CompletableFuture.supplyAsync(() -> "!"); + CompletableFuture[] cfs = new CompletableFuture[] { cf1, cf2, cf3 }; + CompletableFuture allCf = CompletableFuture.allOf(cfs); + assertFalse(allCf.isDone()); + assertFalse(allCf.isCompletedExceptionally()); + allCf.cancel(true); + assertTrue(allCf.isCancelled()); + assertTrue(allCf.isDone()); + } + + CompletableFuture processAsync(List microservices) { + List> dataFetchFutures = fetchDataAsync(microservices); + return combineResults(dataFetchFutures); + } + + private List> fetchDataAsync(List microservices) { + return microservices.stream() + .map(client -> client.retrieveAsync("")) + .collect(Collectors.toList()); + } + + private CompletableFuture combineResults(List> dataFetchFutures) { + return CompletableFuture.allOf(dataFetchFutures.toArray(new CompletableFuture[0])) + .thenApply(v -> dataFetchFutures.stream() + .map(future -> future.exceptionally(ex -> { + throw new CompletionException(ex); + }) + .join()) + .collect(Collectors.joining())); + } + + interface Microservice { + CompletableFuture retrieveAsync(String input); + } +} From 93b63daa27efd5c20a69b5395f09a9c085b060cb Mon Sep 17 00:00:00 2001 From: SGWebFreelancer Date: Tue, 28 Nov 2023 10:24:39 +0800 Subject: [PATCH 721/831] Fix test file name --- ...ompletableFutureTest.java => CompletableFutureUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/{CompletableFutureTest.java => CompletableFutureUnitTest.java} (99%) diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java similarity index 99% rename from core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java index 25e8ea4c81..5953c6d87a 100644 --- a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureTest.java +++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/completablefuture/CompletableFutureUnitTest.java @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import org.junit.Test; -public class CompletableFutureTest { +public class CompletableFutureUnitTest { @Test public void givenAsyncTask_whenProcessingAsyncSucceed_thenReturnSuccess() throws ExecutionException, InterruptedException { From c67139e60ba57b3846e8d8505b93bdf5374443d6 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Tue, 28 Nov 2023 06:38:53 +0200 Subject: [PATCH 722/831] [JAVA-26727] Upgraded maven-javadoc-plugin to 3.6.2 version --- core-java-modules/core-java-console/pom.xml | 2 +- core-java-modules/core-java-documentation/pom.xml | 2 +- core-java-modules/core-java-io-2/pom.xml | 2 +- core-java-modules/core-java-io/pom.xml | 2 +- core-java-modules/core-java-jar/pom.xml | 2 +- core-java-modules/core-java-serialization/pom.xml | 2 +- core-java-modules/core-java-uuid/pom.xml | 2 +- performance-tests/pom.xml | 2 +- .../spring-openapi-generator-api-client/pom.xml | 2 +- .../spring-swagger-codegen-api-client/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-console/pom.xml b/core-java-modules/core-java-console/pom.xml index 8677b672ea..a761b2749e 100644 --- a/core-java-modules/core-java-console/pom.xml +++ b/core-java-modules/core-java-console/pom.xml @@ -159,7 +159,7 @@ - 3.0.0-M1 + 3.6.2 1.8 1.8 0.3.2 diff --git a/core-java-modules/core-java-documentation/pom.xml b/core-java-modules/core-java-documentation/pom.xml index be18af1b10..23443dd5ea 100644 --- a/core-java-modules/core-java-documentation/pom.xml +++ b/core-java-modules/core-java-documentation/pom.xml @@ -33,7 +33,7 @@ - 3.0.0-M1 + 3.6.2 1.8 1.8 diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml index 8632748baa..830b386fe2 100644 --- a/core-java-modules/core-java-io-2/pom.xml +++ b/core-java-modules/core-java-io-2/pom.xml @@ -61,7 +61,7 @@ - 3.0.0-M1 + 3.6.2 3.3.1 diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index faeddafd81..93c9289fdd 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -134,7 +134,7 @@ - 3.5.0 + 3.6.2 2.7.1 2.8.0 diff --git a/core-java-modules/core-java-jar/pom.xml b/core-java-modules/core-java-jar/pom.xml index a46299c669..138827781e 100644 --- a/core-java-modules/core-java-jar/pom.xml +++ b/core-java-modules/core-java-jar/pom.xml @@ -274,7 +274,7 @@ 4.6.1 1.1 - 3.0.0-M1 + 3.6.2 1.4.4 3.1.1 3.3.0 diff --git a/core-java-modules/core-java-serialization/pom.xml b/core-java-modules/core-java-serialization/pom.xml index 63771d2da0..ad0a730514 100644 --- a/core-java-modules/core-java-serialization/pom.xml +++ b/core-java-modules/core-java-serialization/pom.xml @@ -177,7 +177,7 @@ 0.4 1.8.7 1.1 - 3.0.0-M1 + 3.6.2 4.3.20.RELEASE diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml index d46fcd8a65..0a0835ca46 100644 --- a/core-java-modules/core-java-uuid/pom.xml +++ b/core-java-modules/core-java-uuid/pom.xml @@ -154,7 +154,7 @@ - 3.0.0-M1 + 3.6.2 diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index d22a9cf3ac..7927c518f9 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -164,7 +164,7 @@ 3.2.4 3.0.0-M1 3.2.0 - 3.2.0 + 3.6.2 3.1.0 3.9.1 3.2.1 diff --git a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml index ee2c86238a..1e3b93ae42 100644 --- a/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml +++ b/spring-swagger-codegen/spring-openapi-generator-api-client/pom.xml @@ -276,7 +276,7 @@ 2.2 1.10 3.6.1 - 2.10.4 + 3.6.2 2.2.1 1.5 diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index 35f4978411..af12f9cef0 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -196,7 +196,7 @@ 2.2 1.5 2.2.1 - 2.10.4 + 3.6.2 1.10 From 331fb9a477be4641a7e7900bcf7e8550e09ff701 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 28 Nov 2023 12:21:36 +0200 Subject: [PATCH 723/831] [JAVA-27680] Upgraded spring-boot-groovy to jdk17 and spring boot 3 (#15292) --- .../spring-boot-groovy/pom.xml | 22 ++++++++++++------- .../springwithgroovy/entity/Todo.groovy | 12 +++++----- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/spring-boot-modules/spring-boot-groovy/pom.xml b/spring-boot-modules/spring-boot-groovy/pom.xml index 151160bde5..677e07db2d 100644 --- a/spring-boot-modules/spring-boot-groovy/pom.xml +++ b/spring-boot-modules/spring-boot-groovy/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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.app spring-boot-groovy @@ -10,9 +10,10 @@ Spring Boot Todo Application with Groovy - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -25,7 +26,7 @@ spring-boot-starter-web - org.codehaus.groovy + org.apache.groovy groovy ${groovy.version} @@ -39,6 +40,11 @@ h2 runtime + + io.rest-assured + rest-assured + test + @@ -71,8 +77,8 @@ com.baeldung.springwithgroovy.SpringBootGroovyApplication - 3.0.13 - 1.9.0 + 4.0.11 + 3.0.2 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy index 000d981701..31274e1f07 100644 --- a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy +++ b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springwithgroovy/entity/Todo.groovy @@ -1,11 +1,11 @@ package com.baeldung.springwithgroovy.entity -import javax.persistence.Column -import javax.persistence.Entity -import javax.persistence.GeneratedValue -import javax.persistence.GenerationType -import javax.persistence.Id -import javax.persistence.Table +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id +import jakarta.persistence.Table @Entity @Table(name = 'todo') From 7b5225e8db05bd236cafa955223212c2db435bc2 Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Tue, 28 Nov 2023 12:14:50 -0300 Subject: [PATCH 724/831] BAEL-7022 Why wait must be called in a synchronized block - Changing Boolean to primitive Based on a comment. --- .../com/baeldung/wait_synchronization/ConditionChecker.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java index dca36fe7cb..34e0a7522b 100644 --- a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/wait_synchronization/ConditionChecker.java @@ -2,7 +2,7 @@ package com.baeldung.wait_synchronization; public class ConditionChecker { - private volatile Boolean jobIsDone; + private volatile boolean jobIsDone; private final Object lock = new Object(); public void ensureCondition() { @@ -21,4 +21,4 @@ public class ConditionChecker { lock.notify(); } } -} \ No newline at end of file +} From 6ecf4f2bd9d8013f83948f58715ee758842bb470 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 29 Nov 2023 17:54:00 +0530 Subject: [PATCH 725/831] JAVA-26778: Changes made for Upgrade jaxb2-maven-plugin to latest version (#15220) --- feign/pom.xml | 14 +++++++++++++- pom.xml | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/feign/pom.xml b/feign/pom.xml index edb55e7da5..127f6c490c 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -74,6 +74,17 @@ ${wire.mock.version} test + + jakarta.xml.bind + jakarta.xml.bind-api + 4.0.0 + + + com.sun.xml.bind + jaxb-impl + 4.0.0 + runtime + @@ -85,7 +96,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.5.0 + 3.1.0 xjc @@ -131,6 +142,7 @@ 3.8.0 3.1.2 2.33.2 + 4.0.0 \ No newline at end of file diff --git a/pom.xml b/pom.xml index f5aedd091e..32b8e8c8c8 100644 --- a/pom.xml +++ b/pom.xml @@ -726,7 +726,7 @@ dozer drools dubbo - + feign gcp-firebase geotools google-auto-project @@ -970,7 +970,7 @@ dozer drools dubbo - + feign gcp-firebase geotools google-auto-project From eac9c4d5e90218a5b5e9f9b53384bc7afc4176b7 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:45:34 +0530 Subject: [PATCH 726/831] BAEL-7259 --- persistence-modules/java-harperdb/pom.xml | 11 +- .../baledung/harperdb/HarperDBLiveTest.java | 109 +++++++++++++----- .../src/test/resources/UserDefinedViews.json | 5 + .../java-harperdb/src/test/resources/test.db | 0 4 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json create mode 100644 persistence-modules/java-harperdb/src/test/resources/test.db diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 896a58f858..56b63948c9 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -38,6 +38,11 @@ testcontainers test + + org.apache.derby + derby + 10.13.1.1 + @@ -52,10 +57,4 @@ - - 19 - 19 - UTF-8 - - \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java index 1cd377dc6d..5908a57560 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java @@ -11,8 +11,10 @@ import org.testcontainers.containers.GenericContainer; import java.io.IOException; import java.net.URISyntaxException; +import java.net.URL; import java.sql.*; import java.util.Arrays; +import java.util.Map; import java.util.Properties; import static org.junit.jupiter.api.Assertions.*; @@ -21,11 +23,10 @@ public class HarperDBLiveTest { private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTest.class); - private static String host; - private static Integer port; private static HarperDBContainer harperDBContainer; + private static HarperDBApiService harperDbApiService; @BeforeAll @@ -40,7 +41,6 @@ public class HarperDBLiveTest { GenericContainer genericContainer = harperDBContainer.installHarperDB(); - host = genericContainer.getHost(); genericContainer.start(); port = genericContainer.getFirstMappedPort(); @@ -51,7 +51,7 @@ public class HarperDBLiveTest { harperDbApiService = new HarperDBApiService(url, "admin", "password"); } - private static void setupDB() throws URISyntaxException, IOException { + private static void setupDB() throws IOException { harperDbApiService.createSchema("Demo"); harperDbApiService.createTable("Demo", "Subject", "name"); @@ -99,7 +99,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { + void whenConnectionInfoInURL_thenConnectSuccess() { assertDoesNotThrow(() -> { final String JDBC_URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; @@ -112,7 +112,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { + void whenConnectionInfoInProperties_thenConnectSuccess() { assertDoesNotThrow(() -> { Properties prop = new Properties(); prop.setProperty("Server", "127.0.0.1:" + port); @@ -128,7 +128,7 @@ public class HarperDBLiveTest { } @Test - void whenConnectionPooling_thenConnectSuccess() throws SQLException { + void whenConnectionPooling_thenConnectSuccess() { assertDoesNotThrow(() -> { HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); final String JDBC_URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port + ";User=admin;Password=password;"; @@ -176,6 +176,7 @@ public class HarperDBLiveTest { assertEquals(2, statement.getUpdateCount()); } } + @Test void givenPrepareStatement_whenAddToBatch_thenSuccess() throws SQLException { final String INSERT_SQL = "insert into Demo.Teacher(id, name, joining_date) values" @@ -199,12 +200,23 @@ public class HarperDBLiveTest { } } - private static Connection getConnection() throws SQLException { String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; return DriverManager.getConnection(URL); } + private static Connection getConnection(Map properties) throws SQLException { + Properties prop = new Properties(); + prop.setProperty("Server", "127.0.0.1:" + port); + prop.setProperty("User", "admin"); + prop.setProperty("Password", "password"); + for (Map.Entry entry : properties.entrySet()) { + prop.setProperty(entry.getKey(), entry.getValue()); + } + + return DriverManager.getConnection("jdbc:harperdb:", prop); + } + @Test void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { final String SQL_QUERY = "select id, name from Demo.Subject where name = 'Maths'"; @@ -213,9 +225,9 @@ public class HarperDBLiveTest { Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(SQL_QUERY); while (resultSet.next()) { - int id = resultSet.getInt("id"); + Integer id = resultSet.getInt("id"); String name = resultSet.getString("name"); - assertNotNull(Integer.valueOf(id)); + assertNotNull(id); assertEquals("Maths", name); logger.info("Subject id:" + id + " Subject Name:" + name); } @@ -245,25 +257,6 @@ public class HarperDBLiveTest { } } } - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name from Demo.Subject where name = ?"; - - try (Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Maths"); - - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Maths", name); - logger.info("Subject id:" + id + " Subject Name:" + name); - } - } - } - @Test void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { @@ -325,4 +318,62 @@ public class HarperDBLiveTest { assertEquals(1, preparedStatement.getUpdateCount()); } } + + @Test + void givenTempTable_whenInsertIntoSelectTempTable_thenSuccess() throws SQLException { + try (Connection connection = getConnection()) { + Statement statement = connection.createStatement(); + assertDoesNotThrow(() -> { + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('12', 'David Flinch', '04-04-2014')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('13', 'Stephen Hawkins', '04-07-2017')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('14', 'Albert Einstein', '12-08-2020')"); + statement.execute("insert into Teacher#TEMP(id, name, joining_date) " + + "values('15', 'Leo Tolstoy', '20-08-2022')"); + }); + assertDoesNotThrow(() -> statement.execute("insert into Demo.Teacher(id, name, joining_date) " + + "select id, name, joining_date from Teacher#TEMP")); + ResultSet resultSet = statement.executeQuery("select count(id) as rows from Demo.Teacher where id in" + + " (12, 13, 14, 15)"); + resultSet.next(); + int totalRows = resultSet.getInt("rows"); + logger.info("total number of rows fetched:" + totalRows); + assertEquals(4, totalRows); + } + } + + @Test + void givenUserDefinedView_whenQueryView_thenSuccess() throws SQLException { + URL url = ClassLoader.getSystemClassLoader().getResource("UserDefinedViews.json"); + + String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/')); + + try(Connection connection = getConnection(Map.of("Location", folderPath))) { + PreparedStatement preparedStatement = connection.prepareStatement("select teacher_name,subject_name" + + " from UserViews.View_Teacher_Details where subject_name = ?"); + preparedStatement.setString(1, "Science"); + ResultSet resultSet = preparedStatement.executeQuery(); + while(resultSet.next()) { + assertEquals("Science", resultSet.getString("subject_name")); + logger.info("Science Teacher Name:" + resultSet.getString("teacher_name")); + } + } + } + + @Test + void givenAutoCache_whenQuery_thenSuccess() throws SQLException { + URL url = ClassLoader.getSystemClassLoader().getResource("test.db"); + String folderPath = url.getPath().substring(0, url.getPath().lastIndexOf('/')); + logger.info("Cache Location:" + folderPath); + try(Connection connection = getConnection(Map.of("AutoCache", "true", "CacheLocation", folderPath))) { + PreparedStatement preparedStatement = connection.prepareStatement("select id, name from Demo.Subject"); + + ResultSet resultSet = preparedStatement.executeQuery(); + while(resultSet.next()) { + logger.info("Subject Name:" + resultSet.getString("name")); + } + } + } } diff --git a/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json new file mode 100644 index 0000000000..fba67def3c --- /dev/null +++ b/persistence-modules/java-harperdb/src/test/resources/UserDefinedViews.json @@ -0,0 +1,5 @@ +{ + "View_Teacher_Details": { + "query": "SELECT t.name as teacher_name, t.joining_date as joining_date, s.name as subject_name from Demo.Teacher_Details AS td INNER JOIN Demo.Teacher AS t ON t.id = td.teacher_id INNER JOIN Demo.Subject AS s on s.id = td.subject_id" + } +} \ No newline at end of file diff --git a/persistence-modules/java-harperdb/src/test/resources/test.db b/persistence-modules/java-harperdb/src/test/resources/test.db new file mode 100644 index 0000000000..e69de29bb2 From 952f1d2cd2f11c88dc9b24584c08acf36805ec44 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:56:38 +0530 Subject: [PATCH 727/831] Deleted unused file --- .../harperdb/HarperDBLiveTestOld.java | 356 ------------------ 1 file changed, 356 deletions(-) delete mode 100644 persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java b/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java deleted file mode 100644 index 8becea76a5..0000000000 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTestOld.java +++ /dev/null @@ -1,356 +0,0 @@ -package com.baledung.harperdb; - -import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.ClassicHttpRequest; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.HttpEntity; -import com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.http.io.entity.StringEntity; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testcontainers.containers.GenericContainer; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.sql.*; -import java.util.Map; -import java.util.Properties; - -import static org.junit.jupiter.api.Assertions.*; - -public class HarperDBLiveTestOld { - private static final Logger logger = LoggerFactory.getLogger(HarperDBLiveTestOld.class); - - private static String host; - - private static Integer port; - - private static GenericContainer harperDBContainer; - - @BeforeAll - static void setupHarperDB() throws IOException, InterruptedException, URISyntaxException { - installHarperDB(); - setupDB(); - } - - private static void installHarperDB() { - Map envMap = Map.of( - "HDB_ADMIN_USERNAME", "admin", - "HDB_ADMIN_PASSWORD", "password", - "OPERATIONSAPI_NETWORK_PORT", "9925", - "ROOTPATH", "/home/harperdb/hdb", - "LOGGING_STDSTREAMS", "true" - ); - - harperDBContainer = new GenericContainer("harperdb/harperdb:latest") - .withEnv(envMap) - .withExposedPorts(9925, 9926); - host = harperDBContainer.getHost(); - harperDBContainer.start(); - port = harperDBContainer.getFirstMappedPort(); - logger.info("DB Host:" + host + "\n DB Port:" + port); - } - - private static void setupDB() throws URISyntaxException, IOException { - setupSchema("demo"); - createTable("demo", "student", "name", "grade", "subject_id"); - createTable("demo", "teacher", "name", "joining_date", "subject_id"); - insertRecords(); - } - - private static void setupSchema(String schema) throws URISyntaxException, IOException { - String requestBody = "{\"operation\":\"create_schema\", \"" + "schema\":\"" + schema + "\"" + "}"; - executeHttpPostRequest(requestBody); - } - - private static void executeHttpPostRequest(String httpRequest) throws IOException { - logger.info("Post request body:" + httpRequest); - - try (CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build()) { - HttpPost request = new HttpPost("http://localhost:" + port + "/"); - request.addHeader("Authorization", "Basic YWRtaW46cGFzc3dvcmQ="); - request.addHeader("Content-Type", "application/json"); - request.setEntity((HttpEntity) new StringEntity(httpRequest)); - CloseableHttpResponse response = closeableHttpClient.execute((ClassicHttpRequest) request); - logger.info("REST API response:" + response.toString()); - assertEquals(200, response.getCode()); - } - } - - private void insertStudentRecords() { - - } - - private void insertSubjectRecords() { - - } - - private void insertTeacherRecords() { - - } - - private static void createTable(String schemaName, String tableName, String... attributes) throws IOException { - String createTableReq = "{\"operation\":\"create_table\",\"schema\":\"" - + schemaName + "\",\"table\":\"" - + tableName + "\",\"hash_attribute\":\"id\"" - + "}"; - executeHttpPostRequest(createTableReq); - logger.info("created table:" + tableName); - for (String attribute : attributes) { - String createAttrReq = "{\"operation\":\"create_attribute\",\"schema\":\"" - + schemaName + "\",\"table\":\"" - + tableName + "\",\"attribute\":\"" - + attribute + "\"" - + "}"; - executeHttpPostRequest(createAttrReq); - logger.info("created attribute:" + attribute + " in table:" + tableName); - } - } - - private static void insertRecords() throws IOException { - - String table = "student"; - String schema = "demo"; - String operation = "insert"; - String records = "[" + - "{\"id\":1, \"name\":\"John\", \"grade\":4}," - + "{\"id\":2, \"name\":\"James\", \"grade\":1}," - + "{\"id\":3, \"name\":\"Williams\", \"grade\":1}," - + "{\"id\":4, \"name\":\"Robin\", \"grade\":4}," - + "{\"id\":5, \"name\":\"Torry\", \"grade\":3}," - + "{\"id\":6, \"name\":\"Nancy\", \"grade\":5}," - + "{\"id\":7, \"name\":\"Mary\", \"grade\":5}," - + "{\"id\":8, \"name\":\"Jenny\", \"grade\":6}," - + "{\"id\":9, \"name\":\"Katy\", \"grade\":6}," - + "{\"id\":15, \"name\":\"Michael\", \"grade\":6}" - + "]"; - String requestBody = "{\"table\":" + "\"" + table + "\"," - + "\"schema\":" + "\"" + schema + "\"" + "," - + "\"operation\":" + "\"" + operation + "\"" + "," - + "\"records\":" + records - + "}"; - String sql = "{" - + "\"operation\":\"sql\", " - + "\"sql\":\"insert into demo.student(id, name, grade) values" - + "(1, 'John', 4), (2, 'James', 1), (3, 'Williams', 1), (4, 'Robin', 4), (5, 'Torry', 3)," - + " (6, 'Nancy', 5), (7, 'Mary', 5), (8, 'Jenny', 6), (9, 'Katy', 6)\"" - + "}"; - executeHttpPostRequest(requestBody); - } - - @AfterAll - static void stopHarperDB() { - harperDBContainer.stop(); - } - - @Test - void whenConnectionInfoInURL_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - - try (Connection connection = DriverManager.getConnection(URL)) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - @Test - void whenConnectionInfoInProperties_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - Properties prop = new Properties(); - prop.setProperty("Server", "127.0.0.1:" + port); - prop.setProperty("User", "admin"); - prop.setProperty("Password", "password"); - - try (Connection connection = DriverManager.getConnection("jdbc:harperdb:", prop)) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - @Test - void whenConnectionPooling_thenConnectSuccess() throws SQLException { - assertDoesNotThrow(() -> { - HarperDBConnectionPoolDataSource harperdbPoolDataSource = new HarperDBConnectionPoolDataSource(); - String URL = "jdbc:harperdb:UseConnectionPooling=true;PoolMaxSize=2;Server=127.0.0.1:" + port - + ";User=admin;Password=1234;"; - harperdbPoolDataSource.setURL(URL); - - try(Connection connection = harperdbPoolDataSource.getPooledConnection().getConnection()) { - connection.createStatement().executeQuery("select 1"); - logger.info("Connection Successful"); - } - }); - } - - private static Connection getConnection() throws SQLException { - String URL = "jdbc:harperdb:Server=127.0.0.1:" + port + ";User=admin;Password=password;"; - return DriverManager.getConnection(URL); - } - - @Test - void givenStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from demo.student"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(SQL_QUERY); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenStatement_whenInsertRecord_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.student(id, name, grade) values (10, 'Barak', 3)"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - } - } - - @Test - void givenStatement_whenInsertRecordInTableWithoutAttributes_thenSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date) " - + "values (1, 'David Martinez', '04-05-2004'), (2, 'Eric Martin', '04-10-2000')"; - final String QUERY_SQL = "select name, joining_date from demo.teacher where name = ?"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(INSERT_SQL)); - PreparedStatement preparedStatement = connection.prepareStatement(QUERY_SQL); - preparedStatement.setString(1, "Eric Martin"); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - String teacherName = resultSet.getString("name"); - String joinDate = resultSet.getString("joining_date"); - assertEquals("Eric Martin", teacherName); - assertEquals("04-10-2000", joinDate); - logger.info("name:" + teacherName + " joining date:" + joinDate); - } - } - } - - @Test - void givenStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update demo.student set grade = 4 where id = 5"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(UPDATE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from demo.student where id = 3"; - - try(Connection connection = getConnection()) { - Statement statement = connection.createStatement(); - assertDoesNotThrow(() -> statement.execute(DELETE_SQL)); - assertEquals(1, statement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenFetchRecord_thenSuccess() throws SQLException { - final String SQL_QUERY = "select id, name, grade from demo.student where name = ? and grade = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(SQL_QUERY); - preparedStatement.setString(1, "Robin"); - preparedStatement.setInt(2, 4); - ResultSet resultSet = preparedStatement.executeQuery(); - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - int grade = resultSet.getInt("grade"); - assertNotNull(Integer.valueOf(id)); - assertEquals("Robin", name); - logger.info("Student id:" + id + " Student Name:" + name + " grade:" + grade); - } - } - } - - @Test - void givenPreparedStatement_whenDeleteRecord_thenSuccess() throws SQLException { - final String DELETE_SQL = "delete from demo.student where name = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(DELETE_SQL); - preparedStatement.setString(1, "James"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void givenPreparedStatement_whenUpdateRecord_thenSuccess() throws SQLException { - final String UPDATE_SQL = "update demo.student set grade = ? where id = ? and name = ?"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_SQL); - preparedStatement.setInt(1, 5); - preparedStatement.setInt(2, 1); - preparedStatement.setString(3, "John"); - assertDoesNotThrow(() -> preparedStatement.execute()); - assertEquals(1, preparedStatement.getUpdateCount()); - } - } - - @Test - void whenAddtoBatch_thenExecuteBatchIsSuccess() throws SQLException { - final String INSERT_SQL = "insert into demo.teacher(id, name, joining_date)" - + "values(?, ?, ?)"; - - try(Connection connection = getConnection()) { - PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL); - preparedStatement.setInt(1, 1); - preparedStatement.setString(2, "Bret Lee"); - preparedStatement.setString(3, "07-08-2002"); - preparedStatement.addBatch(); - - preparedStatement.setInt(1, 2); - preparedStatement.setString(2, "Sarah Glimmer"); - preparedStatement.setString(3, "07-08-1997"); - preparedStatement.addBatch(); - - assertDoesNotThrow(() -> preparedStatement.executeBatch()); - } - } - - @Test - void whenExecuteStoredToCreateTable_thenSuccess() throws SQLException { - final String CREATE_TABLE_SQL = "CreateTable"; - try(Connection connection = getConnection()) { - CallableStatement callableStatement = connection.prepareCall(CREATE_TABLE_SQL); - - callableStatement.setString("SchemaName", "prod"); //schema gets created too - callableStatement.setString("TableName", "subject"); - callableStatement.setString("PrimaryKey", "id"); - Boolean result = callableStatement.execute(); - - ResultSet resultSet = callableStatement.getResultSet(); - - while(resultSet.next()) { - String tableCreated = resultSet.getString("Success"); - assertEquals("true", tableCreated); - logger.info("result of the callable execute:" + tableCreated); - } - } - } -} From c2b0f73f33cf69030747c5f693bb149ea6f98870 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 29 Nov 2023 20:01:31 +0530 Subject: [PATCH 728/831] included persistence-modules/java-harperdb --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 7099dd8cbc..219fc19071 100644 --- a/pom.xml +++ b/pom.xml @@ -819,6 +819,7 @@ performance-tests persistence-modules persistence-modules/spring-data-neo4j + persistence-modules/java-harperdb protobuffer quarkus-modules reactive-systems From 44e565ffe82395c5dca2464588b43ac8734e3446 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Wed, 29 Nov 2023 17:25:49 +0200 Subject: [PATCH 729/831] [JAVA-26711] Upgraded shedlock to latest version(5.10.0) --- spring-boot-modules/spring-boot-libraries/pom.xml | 2 +- .../scheduling/shedlock/BaeldungTaskScheduler.java | 4 ++-- spring-core-2/pom.xml | 12 ------------ 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml index b0f0c780aa..fd3daa1a79 100644 --- a/spring-boot-modules/spring-boot-libraries/pom.xml +++ b/spring-boot-modules/spring-boot-libraries/pom.xml @@ -225,7 +225,7 @@ 2.2.4 3.2.0 0.23.0 - 2.1.0 + 5.10.0 1.5-beta1 2.1 2.6.0 diff --git a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java index cd5f63e962..c03d351c20 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java +++ b/spring-boot-modules/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/BaeldungTaskScheduler.java @@ -1,13 +1,13 @@ package com.baeldung.scheduling.shedlock; -import net.javacrumbs.shedlock.core.SchedulerLock; +import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component class BaeldungTaskScheduler { @Scheduled(cron = "0 0/15 * * * ?") - @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") + @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastFor = "PT5M", lockAtMostFor = "PT14M") public void scheduledTask() { System.out.println("Running ShedLock task"); } diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f27b16acc3..bed0d730b2 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -119,17 +119,6 @@ spring-boot-starter-test test - - - net.javacrumbs.shedlock - shedlock-spring - ${shedlock.version} - - - net.javacrumbs.shedlock - shedlock-provider-jdbc-template - ${shedlock.version} - org.projectlombok lombok @@ -161,7 +150,6 @@ 1.3.2 3.6 - 2.1.0 3.22.0-GA 3.2.2 From 7683cff43d657d890fe8c10b3967f85f20ad0f5a Mon Sep 17 00:00:00 2001 From: gaepi Date: Thu, 30 Nov 2023 10:20:20 +0100 Subject: [PATCH 730/831] JAVA-26724 | kafka testcontainers version update --- apache-kafka-2/pom.xml | 2 +- apache-kafka/pom.xml | 2 +- spring-boot-modules/spring-boot-documentation/pom.xml | 2 +- spring-kafka-2/pom.xml | 2 +- spring-kafka/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index d1f74e8aae..cd21a60e14 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -62,7 +62,7 @@ 5.7.0 2.8.0 - 1.15.3 + 1.19.3 1.15.3 2.15.2 diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml index 494bc94961..22be7a83c6 100644 --- a/apache-kafka/pom.xml +++ b/apache-kafka/pom.xml @@ -182,7 +182,7 @@ 3.4.0 - 1.15.3 + 1.19.3 1.15.3 1.16.1 3.0.0 diff --git a/spring-boot-modules/spring-boot-documentation/pom.xml b/spring-boot-modules/spring-boot-documentation/pom.xml index 3ac2799258..30a82660af 100644 --- a/spring-boot-modules/spring-boot-documentation/pom.xml +++ b/spring-boot-modules/spring-boot-documentation/pom.xml @@ -95,7 +95,7 @@ 2.2.11 0.14.0 0.14.0 - 1.18.3 + 1.19.3 diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index fdf7da7438..05da9418b7 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -64,7 +64,7 @@ - 1.16.2 + 1.19.3 3.0.12 3.6.0 1.16.2 diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 7ff7a9710a..ddef3ca180 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -92,7 +92,7 @@ 3.0.5 1.10.5 - 1.16.2 + 1.19.3 \ No newline at end of file From 5990aeee283a63ce0146baa756a4bc3843ebf84b Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:05:22 +0200 Subject: [PATCH 731/831] [JAVA-27742] Replaced aspectj-maven-plugin with dev.aspectj that supports java 17 (#15289) --- spring-di-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index 0bd6c41a8c..898dd182f1 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/pom.xml @@ -55,9 +55,9 @@ - org.codehaus.mojo + dev.aspectj aspectj-maven-plugin - ${aspectj-plugin.version} + ${aspectj-maven-plugin.version} ${java.version} @@ -80,7 +80,7 @@ 3.1.2 - 1.14.0 + 1.13.1 2.17.1 From 57eaebe8d5e116cfc52c9b0c3b5b343db0eef202 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:40:11 +0530 Subject: [PATCH 732/831] BAEL-7259: renamed package --- .../com/{baledung => baeldung}/harperdb/HarperDBApiService.java | 2 +- .../com/{baledung => baeldung}/harperdb/HarperDBContainer.java | 2 +- .../com/{baledung => baeldung}/harperdb/HarperDBLiveTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBApiService.java (99%) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBContainer.java (97%) rename persistence-modules/java-harperdb/src/test/java/com/{baledung => baeldung}/harperdb/HarperDBLiveTest.java (99%) diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java similarity index 99% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java index 15178f9769..361e17bd83 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBApiService.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBApiService.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.classic.methods.HttpPost; import com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.classic.CloseableHttpClient; diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java similarity index 97% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java index 5ce6e069ce..12ef87fa99 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBContainer.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBContainer.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import java.util.Map; diff --git a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java similarity index 99% rename from persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java rename to persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java index 5908a57560..34d2f8d29b 100644 --- a/persistence-modules/java-harperdb/src/test/java/com/baledung/harperdb/HarperDBLiveTest.java +++ b/persistence-modules/java-harperdb/src/test/java/com/baeldung/harperdb/HarperDBLiveTest.java @@ -1,4 +1,4 @@ -package com.baledung.harperdb; +package com.baeldung.harperdb; import cdata.jdbc.harperdb.HarperDBConnectionPoolDataSource; From 35b88b06afae92c4271eabb5764771731f973c79 Mon Sep 17 00:00:00 2001 From: Maiklins Date: Thu, 30 Nov 2023 16:10:46 +0100 Subject: [PATCH 733/831] Update README.md --- core-java-modules/core-java-8-datetime-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-datetime-2/README.md b/core-java-modules/core-java-8-datetime-2/README.md index f7ada52da6..6fe450816e 100644 --- a/core-java-modules/core-java-8-datetime-2/README.md +++ b/core-java-modules/core-java-8-datetime-2/README.md @@ -8,4 +8,5 @@ - [Add Minutes to a Time String in Java](https://www.baeldung.com/java-string-time-add-mins) - [Round the Date in Java](https://www.baeldung.com/java-round-the-date) - [Representing Furthest Possible Date in Java](https://www.baeldung.com/java-date-represent-max) +- [Retrieving Unix Time in Java](https://www.baeldung.com/java-retrieve-unix-time) - [[<-- Prev]](/core-java-modules/core-java-datetime-java8-1) From e076a171eef9c30d47716f3fa81bf4ad6414046a Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Thu, 30 Nov 2023 22:54:02 +0530 Subject: [PATCH 734/831] JAVA-26736 Upgrade jackson to latest version --- core-java-modules/core-java-11-3/pom.xml | 2 +- core-java-modules/core-java-collections-list-5/pom.xml | 2 +- core-java-modules/core-java-collections-maps-6/pom.xml | 2 +- core-java-modules/core-java-string-operations-3/pom.xml | 2 +- .../baeldung/versioncomparison/VersionComparisonUnitTest.java | 2 +- jackson-modules/jackson-polymorphic-deserialization/pom.xml | 4 ++-- jackson-simple/pom.xml | 2 +- persistence-modules/hibernate-mapping/pom.xml | 2 +- persistence-modules/spring-data-elasticsearch/pom.xml | 2 +- pom.xml | 2 +- spring-batch/pom.xml | 2 +- spring-boot-modules/spring-boot-resilience4j/pom.xml | 2 +- .../custom-validations-opeanpi-codegen/pom.xml | 2 +- testing-modules/mocks-2/pom.xml | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml index 22db9e62ab..0161f4dcca 100644 --- a/core-java-modules/core-java-11-3/pom.xml +++ b/core-java-modules/core-java-11-3/pom.xml @@ -45,7 +45,7 @@ 11 11 - 2.14.1 + 2.16.0 2.10 diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index b8832df357..c89ad0fad9 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -67,7 +67,7 @@ 1.21 2.2 2.10.1 - 2.15.2 + 2.16.0 20230618 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index 8c35dcee6e..fd28e9cc57 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -20,7 +20,7 @@ com.fasterxml.jackson.core jackson-databind - 2.13.1 + 2.16.0 org.openjdk.jmh diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml index 0558e71a35..59d14805a0 100644 --- a/core-java-modules/core-java-string-operations-3/pom.xml +++ b/core-java-modules/core-java-string-operations-3/pom.xml @@ -72,7 +72,7 @@ 5.3.9 3.6.3 6.1.1 - 2.11.1 + 2.16.0 3.1.0 diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java index 145e9788e4..a99778201a 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/versioncomparison/VersionComparisonUnitTest.java @@ -87,7 +87,7 @@ public class VersionComparisonUnitTest { assertTrue(version1_1_maven.compareTo(version1_1_gradle) < 0); Version version1_1_snapshot = new Version(1, 1, 0, "snapshot", null, null); - assertEquals(0, version1_1.compareTo(version1_1_snapshot)); + assertEquals(1, version1_1.compareTo(version1_1_snapshot)); assertTrue(version1_1_snapshot.isSnapshot()); } diff --git a/jackson-modules/jackson-polymorphic-deserialization/pom.xml b/jackson-modules/jackson-polymorphic-deserialization/pom.xml index 0d88c19500..cbf67e5013 100644 --- a/jackson-modules/jackson-polymorphic-deserialization/pom.xml +++ b/jackson-modules/jackson-polymorphic-deserialization/pom.xml @@ -16,7 +16,7 @@ com.fasterxml.jackson.core jackson-core - ${jackson-core.version} + ${jackson.version} org.reflections @@ -36,7 +36,7 @@ - 2.15.2 + 2.16.0 0.9.11 diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 3bf523bbfa..2ba3868ee2 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -33,7 +33,7 @@ - 2.15.2 + 2.16.0 17 diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index 0ce112b9e6..45d8e24b41 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -86,7 +86,7 @@ 3.0.1-b11 1.1 1.4.2 - 2.14.2 + 2.16.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index 6535b9ac4b..91dc3ee4d2 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -60,7 +60,7 @@ 5.1.2 8.9.0 - 2.15.2 + 2.16.0 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 32b8e8c8c8..1c685bc5e3 100644 --- a/pom.xml +++ b/pom.xml @@ -1221,7 +1221,7 @@ 1.2 2.3.3 1.2 - 2.15.2 + 2.16.0 1.5 1.9.2 5.9.2 diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index 20b0ef6d1c..bca0030729 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -77,7 +77,7 @@ 5.8 4.0.0 4.0.2 - 2.14.2 + 2.16.0 4.5.14 1.5.3 com.baeldung.batchtesting.SpringBatchApplication diff --git a/spring-boot-modules/spring-boot-resilience4j/pom.xml b/spring-boot-modules/spring-boot-resilience4j/pom.xml index 355ef8f92d..2f3af8f9d2 100644 --- a/spring-boot-modules/spring-boot-resilience4j/pom.xml +++ b/spring-boot-modules/spring-boot-resilience4j/pom.xml @@ -53,7 +53,7 @@ 2.35.0 2.0.2 - 2.15.2 + 2.16.0 \ No newline at end of file diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index 95d3239b96..ded02da62c 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -88,7 +88,7 @@ 2.17.1 1.7.0 3.3.4 - 2.10.0.pr3 + 2.16.0 5.1.0 diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml index 22a5198b8c..2ef1a03dff 100644 --- a/testing-modules/mocks-2/pom.xml +++ b/testing-modules/mocks-2/pom.xml @@ -33,7 +33,7 @@ 1.6.0 - 2.13.4 + 2.16.0 5.3.25 From 339b269caa64a5647d10f66b98815698968ba20f Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Thu, 30 Nov 2023 18:35:21 +0000 Subject: [PATCH 735/831] Update article httpsecurity vs websecurity --- .../WebSecurityConfig.java | 87 ++++++++++++++----- .../controller/AdminController.java | 15 ++++ 2 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index 46a82918aa..f5b799065b 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -1,35 +1,78 @@ package com.baeldung.httpsecurityvswebsecurity; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.firewall.HttpFirewall; +import org.springframework.security.web.firewall.StrictHttpFirewall; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.security.config.Customizer.withDefaults; @Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +@EnableWebSecurity +public class WebSecurityConfig { - @Autowired - private UserDetailsService userDetailsService; - - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .userDetailsService(userDetailsService) - .passwordEncoder(new BCryptPasswordEncoder()); + @Bean + public HttpFirewall allowHttpMethod() { + List allowedMethods = new ArrayList(); + allowedMethods.add("GET"); + allowedMethods.add("POST"); + StrictHttpFirewall firewall = new StrictHttpFirewall(); + firewall.setAllowedHttpMethods(allowedMethods); + return firewall; } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/") - .permitAll() + @Bean + public WebSecurityCustomizer fireWall() { + return (web) -> web.httpFirewall(allowHttpMethod()); + } + + @Bean + public WebSecurityCustomizer ignoringCustomizer() { + return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); + } + + @Bean + public WebSecurityCustomizer debugSecurity() { + return (web) -> web.debug(true); + } + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user") + .password(encoder().encode("userPass")) + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user); + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") + .hasRole("ADMIN") .anyRequest() - .authenticated() - .and() - .formLogin(); + .permitAll()) + .httpBasic(withDefaults()) + .formLogin(withDefaults()) + .csrf(AbstractHttpConfigurer::disable); + return http.build(); } + } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java new file mode 100644 index 0000000000..cd1daee17e --- /dev/null +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/controller/AdminController.java @@ -0,0 +1,15 @@ +package com.baeldung.httpsecurityvswebsecurity.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/admin") +public class AdminController { + + @RequestMapping("/greeting") + public String hello() { + return "Hello Admin"; + } + +} From dea22a68632b94ee4dfe45c64ec631fd350fdba2 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Thu, 30 Nov 2023 18:42:41 +0000 Subject: [PATCH 736/831] Update article httpsecurity vs websecurity --- .../SecurityConfiguration.java | 78 +++++++++++++++++ .../WebSecurityConfig.java | 87 +++++-------------- 2 files changed, 100 insertions(+), 65 deletions(-) create mode 100644 spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java new file mode 100644 index 0000000000..5c0853e6f3 --- /dev/null +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/SecurityConfiguration.java @@ -0,0 +1,78 @@ +package com.baeldung.httpsecurityvswebsecurity; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.firewall.HttpFirewall; +import org.springframework.security.web.firewall.StrictHttpFirewall; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.security.config.Customizer.withDefaults; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + @Bean + public HttpFirewall allowHttpMethod() { + List allowedMethods = new ArrayList(); + allowedMethods.add("GET"); + allowedMethods.add("POST"); + StrictHttpFirewall firewall = new StrictHttpFirewall(); + firewall.setAllowedHttpMethods(allowedMethods); + return firewall; + } + + @Bean + public WebSecurityCustomizer fireWall() { + return (web) -> web.httpFirewall(allowHttpMethod()); + } + + @Bean + public WebSecurityCustomizer ignoringCustomizer() { + return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); + } + + @Bean + public WebSecurityCustomizer debugSecurity() { + return (web) -> web.debug(true); + } + + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user") + .password(encoder().encode("userPass")) + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user); + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") + .hasRole("ADMIN") + .anyRequest() + .permitAll()) + .httpBasic(withDefaults()) + .formLogin(withDefaults()) + .csrf(AbstractHttpConfigurer::disable); + return http.build(); + } + +} diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java index f5b799065b..46a82918aa 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/httpsecurityvswebsecurity/WebSecurityConfig.java @@ -1,78 +1,35 @@ package com.baeldung.httpsecurityvswebsecurity; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.firewall.HttpFirewall; -import org.springframework.security.web.firewall.StrictHttpFirewall; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.security.config.Customizer.withDefaults; @Configuration -@EnableWebSecurity -public class WebSecurityConfig { +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - @Bean - public HttpFirewall allowHttpMethod() { - List allowedMethods = new ArrayList(); - allowedMethods.add("GET"); - allowedMethods.add("POST"); - StrictHttpFirewall firewall = new StrictHttpFirewall(); - firewall.setAllowedHttpMethods(allowedMethods); - return firewall; + @Autowired + private UserDetailsService userDetailsService; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .userDetailsService(userDetailsService) + .passwordEncoder(new BCryptPasswordEncoder()); } - @Bean - public WebSecurityCustomizer fireWall() { - return (web) -> web.httpFirewall(allowHttpMethod()); - } - - @Bean - public WebSecurityCustomizer ignoringCustomizer() { - return (web) -> web.ignoring().antMatchers("/resources/**", "/static/**"); - } - - @Bean - public WebSecurityCustomizer debugSecurity() { - return (web) -> web.debug(true); - } - - @Bean - public InMemoryUserDetailsManager userDetailsService() { - UserDetails user = User.withUsername("user") - .password(encoder().encode("userPass")) - .roles("ADMIN") - .build(); - return new InMemoryUserDetailsManager(user); - } - - @Bean - public PasswordEncoder encoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests((authorize) -> authorize.antMatchers("/admin/**") - .hasRole("ADMIN") + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/") + .permitAll() .anyRequest() - .permitAll()) - .httpBasic(withDefaults()) - .formLogin(withDefaults()) - .csrf(AbstractHttpConfigurer::disable); - return http.build(); + .authenticated() + .and() + .formLogin(); } - } From d7bb6bc0a77ae8e4645ee5a582d61a560ad42ded Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Fri, 1 Dec 2023 02:59:17 +0200 Subject: [PATCH 737/831] This commit is related to BAEL-7113 (#15331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a new test class "RoundNumberToNearestMultipleUnitTest" that suggests multiplе mеthods for rounding up a numbеr to thе nеarеst multiplе of 5 in Java. --- .../RoundNumberToNearestMultipleUnitTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java diff --git a/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java new file mode 100644 index 0000000000..24090be343 --- /dev/null +++ b/core-java-modules/core-java-numbers-conversions/src/test/java/com/baeldung/roundnumbertonearestmultiple/RoundNumberToNearestMultipleUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.roundnumbertonearestmultiple; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class RoundNumberToNearestMultipleUnitTest { + + public static int originalNumber = 18; + public static int expectedRoundedNumber = 20; + public static int nearest = 5; + + @Test + public void givenNumber_whenUsingBasicMathOperations_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (originalNumber % nearest == 0) ? originalNumber : ((originalNumber / nearest) + 1) * nearest; + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathCeil_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (int) (Math.ceil(originalNumber / (float) (nearest)) * nearest); + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathRound_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = Math.round(originalNumber / (float) (nearest)) * nearest; + assertEquals(expectedRoundedNumber, roundedNumber); + } + + @Test + public void givenNumber_whenUsingMathFloor_thenRoundUpToNearestMultipleOf5() { + + int roundedNumber = (int) (Math.floor((double) (originalNumber + nearest / 2) / nearest) * nearest); + assertEquals(expectedRoundedNumber, roundedNumber); + } + +} From 671957da9b04903a6985460cc36f6b9555b1156f Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Fri, 1 Dec 2023 03:02:46 +0200 Subject: [PATCH 738/831] This PR is related to BAEL-6315 (#15337) * This commit is related to BAEL-6315 This commit aims to add two classes Contact and Person. * This commit is related to BAEL-6315 This commit aims to add a test class DeserializationUnitTest. --- .../com/baeldung/deserialization/Contact.java | 5 +++ .../com/baeldung/deserialization/Person.java | 5 +++ .../DeserializationUnitTest.java | 39 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java create mode 100644 core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java create mode 100644 core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java new file mode 100644 index 0000000000..80df1393af --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Contact.java @@ -0,0 +1,5 @@ +package com.baeldung.deserialization; + +public record Contact(String email, String phone) { + // Constructor, getters, and other methods are automatically generated +} diff --git a/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java new file mode 100644 index 0000000000..38e3882668 --- /dev/null +++ b/core-java-modules/core-java-20/src/main/java/com/baeldung/deserialization/Person.java @@ -0,0 +1,5 @@ +package com.baeldung.deserialization; + +public record Person(String name, int age, String address, Contact contact) { + // Constructor, getters, and other methods are automatically generated +} \ No newline at end of file diff --git a/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java new file mode 100644 index 0000000000..1256505e0d --- /dev/null +++ b/core-java-modules/core-java-20/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.deserialization; + +import com.google.gson.Gson; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class DeserializationUnitTest { + + @Test + public void givenJsonString_whenDeserialized_thenPersonRecordCreated() { + String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\"}"; + + Person person = new Gson().fromJson(json, Person.class); + + assertEquals("John Doe", person.name()); + assertEquals(30, person.age()); + assertEquals("123 Main St", person.address()); + } + + @Test + public void givenNestedJsonString_whenDeserialized_thenPersonRecordCreated() { + String json = "{\"name\":\"John Doe\",\"age\":30,\"address\":\"123 Main St\",\"contact\":{\"email\":\"john.doe@example.com\",\"phone\":\"555-1234\"}}"; + + Person person = new Gson().fromJson(json, Person.class); + + assertNotNull(person); + assertEquals("John Doe", person.name()); + assertEquals(30, person.age()); + assertEquals("123 Main St", person.address()); + + Contact contact = person.contact(); + + assertNotNull(contact); + assertEquals("john.doe@example.com", contact.email()); + assertEquals("555-1234", contact.phone()); + } +} From 1f7efeddaf524f0d178214c55ef35e2265e509e6 Mon Sep 17 00:00:00 2001 From: Mikhail Polivakha <68962645+Mikhail2048@users.noreply.github.com> Date: Fri, 1 Dec 2023 04:07:18 +0300 Subject: [PATCH 739/831] BAEL-6953 implemented (#15304) * BAEL-6953 implemented * BAEL-6953 added live test * Fixed test --- .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 62076 bytes pom.xml | 1 + spring-kafka-3/pom.xml | 36 +++++++++++ .../com/baeldung/spring/kafka/SomeData.java | 37 ++++++++++++ .../spring/kafka/ListenerConfiguration.java | 42 +++++++++++++ .../spring/kafka/ProducerConfiguration.java | 40 ++++++++++++ .../spring/kafka/TrustedPackagesLiveTest.java | 57 ++++++++++++++++++ 7 files changed, 213 insertions(+) create mode 100644 gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar create mode 100644 spring-kafka-3/pom.xml create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java diff --git a/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar b/gradle-modules/gradle-7/toolchains-feature/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1962a79e29d3e0ab67b14947c167a862655af9b GIT binary patch literal 62076 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 32b8e8c8c8..167509d2b3 100644 --- a/pom.xml +++ b/pom.xml @@ -867,6 +867,7 @@ spring-jersey spring-jinq spring-kafka-2 + spring-kafka-3 spring-kafka spring-katharsis spring-mobile diff --git a/spring-kafka-3/pom.xml b/spring-kafka-3/pom.xml new file mode 100644 index 0000000000..972412d18e --- /dev/null +++ b/spring-kafka-3/pom.xml @@ -0,0 +1,36 @@ + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + 4.0.0 + + spring-kafka-3 + jar + + spring-kafka-3 + + + + org.springframework.kafka + spring-kafka + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework.kafka + spring-kafka-test + test + + + + + 3.0.12 + + diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java new file mode 100644 index 0000000000..eb2e57c33d --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/SomeData.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka; + +import java.time.Instant; + +public class SomeData { + + private String id; + private String type; + private String status; + private Instant timestamp; + + public SomeData() { + } + + public SomeData(String id, String type, String status, Instant timestamp) { + this.id = id; + this.type = type; + this.status = status; + this.timestamp = timestamp; + } + + public String getId() { + return id; + } + + public String getType() { + return type; + } + + public String getStatus() { + return status; + } + + public Instant getTimestamp() { + return timestamp; + } +} diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java new file mode 100644 index 0000000000..e35b1ee415 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ListenerConfiguration.java @@ -0,0 +1,42 @@ +package com.baeldung.spring.kafka; + +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.support.serializer.JsonDeserializer; + +@Configuration +public class ListenerConfiguration { + + @Bean("messageListenerContainer") + public ConcurrentKafkaListenerContainerFactory messageListenerContainer() { + ConcurrentKafkaListenerContainerFactory container = new ConcurrentKafkaListenerContainerFactory<>(); + container.setConsumerFactory(someDataConsumerFactory()); + return container; + } + + @Bean + public ConsumerFactory someDataConsumerFactory() { + JsonDeserializer payloadJsonDeserializer = new JsonDeserializer<>(); + payloadJsonDeserializer.trustedPackages("com.baeldung.spring.kafka"); + return new DefaultKafkaConsumerFactory<>( + consumerConfigs(), + new StringDeserializer(), + payloadJsonDeserializer + ); + } + + @Bean + public Map consumerConfigs() { + return Map.of( + ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092", + ConsumerConfig.GROUP_ID_CONFIG, "some-group-id" + ); + } +} \ No newline at end of file diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java new file mode 100644 index 0000000000..7373424841 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/ProducerConfiguration.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.kafka; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import org.springframework.kafka.support.serializer.JsonSerializer; +import org.springframework.kafka.support.serializer.StringOrBytesSerializer; + +import java.time.Instant; +import java.util.Map; + +@Configuration +public class ProducerConfiguration { + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ProducerFactory producerFactory() { + JsonSerializer jsonSerializer = new JsonSerializer<>(); + jsonSerializer.setAddTypeInfo(true); + return new DefaultKafkaProducerFactory<>( + producerFactoryConfig(), + new StringOrBytesSerializer(), + jsonSerializer + ); + } + + @Bean + public Map producerFactoryConfig() { + return Map.of( + ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "PLAINTEXT://localhost:9092" + ); + } +} \ No newline at end of file diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java new file mode 100644 index 0000000000..fa4b79cd65 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/TrustedPackagesLiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.spring.kafka; + +import java.time.Instant; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.SpyBean; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Component; + +/** + * This test requires a running instance of kafka to be present + */ +@SpringBootTest +public class TrustedPackagesLiveTest { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @SpyBean + TestConsumer testConsumer; + + @Test + void givenMessageInTheTopic_whenTypeInfoPackageIsTrusted_thenMessageIsSuccessfullyConsumed() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + + Mockito.doAnswer(invocationOnMock -> { + try { + latch.countDown(); + return invocationOnMock.callRealMethod(); + } catch (Exception e) { + return null; + } + }).when(testConsumer).onMessage(Mockito.any()); + + SomeData someData = new SomeData("1", "active", "sent", Instant.now()); + kafkaTemplate.send(new ProducerRecord<>("sourceTopic", null, someData)); + + Assertions.assertTrue(latch.await(20L, TimeUnit.SECONDS)); + } + + @Component + static class TestConsumer { + + @KafkaListener(topics = "sourceTopic", containerFactory = "messageListenerContainer") + public void onMessage(SomeData someData) { + + } + } +} From a58783707caf2a8b3c1d27f13393724c92a8b69d Mon Sep 17 00:00:00 2001 From: ovidiu-mihai98 <138307181+ovidiumihaitacu@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:50:18 +0200 Subject: [PATCH 740/831] [BAEL-7067] Difference Between Entity and DTO --- .../entitydtodifferences/Application.java | 12 +++ .../controller/UserController.java | 39 ++++++++ .../entitydtodifferences/dto/BookDto.java | 30 ++++++ .../dto/UserCreationDto.java | 48 ++++++++++ .../dto/UserResponseDto.java | 48 ++++++++++ .../entitydtodifferences/entity/Book.java | 39 ++++++++ .../entitydtodifferences/entity/User.java | 90 ++++++++++++++++++ .../mapper/UserMapper.java | 34 +++++++ .../repository/UserRepository.java | 11 +++ .../ApplicationIntegrationTest.java | 15 +++ .../UserControllerIntegrationTest.java | 93 +++++++++++++++++++ .../entity/BookUnitTest.java | 19 ++++ .../entity/UserUnitTest.java | 51 ++++++++++ .../mapper/UserMapperUnitTest.java | 87 +++++++++++++++++ 14 files changed, 616 insertions(+) create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java create mode 100644 spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java create mode 100644 spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java new file mode 100644 index 0000000000..4a780ac17a --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.entitydtodifferences; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java new file mode 100644 index 0000000000..66cecacd9b --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/controller/UserController.java @@ -0,0 +1,39 @@ +package com.baeldung.entitydtodifferences.controller; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.mapper.UserMapper; +import com.baeldung.entitydtodifferences.repository.UserRepository; + +@RestController +@RequestMapping("/users") +public class UserController { + + private final UserRepository userRepository; + + public UserController(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @GetMapping + public List getUsers() { + return userRepository.findAll() + .stream() + .map(UserMapper::toDto) + .collect(Collectors.toList()); + } + + @PostMapping + public UserResponseDto createUser(@RequestBody UserCreationDto userCreationDto) { + return UserMapper.toDto(userRepository.save(UserMapper.toEntity(userCreationDto))); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java new file mode 100644 index 0000000000..a5ee25f105 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/BookDto.java @@ -0,0 +1,30 @@ +package com.baeldung.entitydtodifferences.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class BookDto { + + @JsonProperty("NAME") + private final String name; + + @JsonProperty("AUTHOR") + private final String author; + + // Default constructor for Jackson deserialization + public BookDto() { + this(null, null); + } + + public BookDto(String name, String author) { + this.name = name; + this.author = author; + } + + public String getName() { + return name; + } + + public String getAuthor() { + return author; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java new file mode 100644 index 0000000000..0859c042cf --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserCreationDto.java @@ -0,0 +1,48 @@ +package com.baeldung.entitydtodifferences.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UserCreationDto { + + @JsonProperty("FIRST_NAME") + private final String firstName; + + @JsonProperty("LAST_NAME") + private final String lastName; + + @JsonProperty("ADDRESS") + private final String address; + + @JsonProperty("BOOKS") + private final List books; + + // Default constructor for Jackson deserialization + public UserCreationDto() { + this(null, null, null, null); + } + + public UserCreationDto(String firstName, String lastName, String address, List books) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + this.books = books; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getAddress() { + return address; + } + + public List getBooks() { + return books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java new file mode 100644 index 0000000000..910689dd41 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/dto/UserResponseDto.java @@ -0,0 +1,48 @@ +package com.baeldung.entitydtodifferences.dto; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UserResponseDto { + + @JsonProperty("ID") + private final Long id; + + @JsonProperty("FIRST_NAME") + private final String firstName; + + @JsonProperty("LAST_NAME") + private final String lastName; + + @JsonProperty("BOOKS") + private final List books; + + // Default constructor for Jackson deserialization + public UserResponseDto() { + this(null, null, null, null); + } + + public UserResponseDto(Long id, String firstName, String lastName, List books) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.books = books; + } + + public Long getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public List getBooks() { + return books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java new file mode 100644 index 0000000000..88e895467a --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/Book.java @@ -0,0 +1,39 @@ +package com.baeldung.entitydtodifferences.entity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "books") +public class Book { + + @Id + private String name; + private String author; + + // Default constructor for JPA deserialization + public Book() { + } + + public Book(String name, String author) { + this.name = name; + this.author = author; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java new file mode 100644 index 0000000000..6a404e9f1f --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/entity/User.java @@ -0,0 +1,90 @@ +package com.baeldung.entitydtodifferences.entity; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String firstName; + private String lastName; + private String address; + + @OneToMany(cascade = CascadeType.ALL) + private List books; + + // Default constructor for JPA deserialization + public User() { + } + + public User(String firstName, String lastName, String address, List books) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + this.books = books; + } + + public String getNameOfMostOwnedBook() { + Map bookOwnershipCount = books.stream() + .collect(Collectors.groupingBy(Book::getName, Collectors.counting())); + return bookOwnershipCount.entrySet() + .stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(null); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java new file mode 100644 index 0000000000..0c6899f98b --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/mapper/UserMapper.java @@ -0,0 +1,34 @@ +package com.baeldung.entitydtodifferences.mapper; + +import java.util.stream.Collectors; + +import com.baeldung.entitydtodifferences.dto.BookDto; +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; + +public class UserMapper { + + public static UserResponseDto toDto(User entity) { + return new UserResponseDto(entity.getId(), entity.getFirstName(), entity.getLastName(), entity.getBooks() + .stream() + .map(UserMapper::toDto) + .collect(Collectors.toList())); + } + + public static User toEntity(UserCreationDto dto) { + return new User(dto.getFirstName(), dto.getLastName(), dto.getAddress(), dto.getBooks() + .stream() + .map(UserMapper::toEntity) + .collect(Collectors.toList())); + } + + public static BookDto toDto(Book entity) { + return new BookDto(entity.getName(), entity.getAuthor()); + } + + public static Book toEntity(BookDto dto) { + return new Book(dto.getName(), dto.getAuthor()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java new file mode 100644 index 0000000000..4529de698e --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/main/java/com/baeldung/entitydtodifferences/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.entitydtodifferences.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.entitydtodifferences.entity.User; + +@Repository +public interface UserRepository extends JpaRepository { + +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java new file mode 100644 index 0000000000..839bb381ec --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/ApplicationIntegrationTest.java @@ -0,0 +1,15 @@ +package com.baeldung.entitydtodifferences; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class ApplicationIntegrationTest { + + @Test + public void contextLoads() { + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java new file mode 100644 index 0000000000..83e359e378 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/controller/UserControllerIntegrationTest.java @@ -0,0 +1,93 @@ +package com.baeldung.entitydtodifferences.controller; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; +import com.baeldung.entitydtodifferences.repository.UserRepository; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +@SpringBootTest +@AutoConfigureMockMvc +public class UserControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private UserRepository userRepository; + + @Autowired + private ObjectMapper objectMapper; + + @BeforeEach + public void beforeEach() { + userRepository.deleteAll(); + } + + @Test + public void givenUsersAreExisting_whenGetUsers_thenUsersAreReturned() throws Exception { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User savedUser = userRepository.save(new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2))); + String expectedJson = String.format( + "[{\"ID\":%s,\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}]", + savedUser.getId()); + //when + MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/users") + .contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + //then + assertEquals(expectedJson, result.getResponse() + .getContentAsString()); + } + + @Test + public void givenValidUser_whenPostUser_thenUserIsCreated() throws Exception { + //given + String user = "{\"FIRST_NAME\":\"John\",\"LAST_NAME\":\"Doe\",\"BOOKS\":[{\"NAME\":\"Book1\",\"AUTHOR\":\"Author1\"},{\"NAME\":\"Book2\",\"AUTHOR\":\"Author2\"}]}"; + //when + MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/users") + .content(user) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn(); + JsonNode responseJson = objectMapper.readTree(result.getResponse() + .getContentAsString()); + //then + assertEquals("John", responseJson.get("FIRST_NAME") + .asText()); + assertEquals("Doe", responseJson.get("LAST_NAME") + .asText()); + assertTrue(responseJson.has("BOOKS")); + JsonNode booksArray = responseJson.get("BOOKS"); + assertEquals(2, booksArray.size()); + assertEquals("Book1", booksArray.get(0) + .get("NAME") + .asText()); + assertEquals("Author1", booksArray.get(0) + .get("AUTHOR") + .asText()); + assertEquals("Book2", booksArray.get(1) + .get("NAME") + .asText()); + assertEquals("Author2", booksArray.get(1) + .get("AUTHOR") + .asText()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java new file mode 100644 index 0000000000..60e229b7c9 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/BookUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.entitydtodifferences.entity; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.Test; + +public class BookUnitTest { + + @Test + public void whenBookInitialized_thenInitializedCorrectly() { + //when + Book book = new Book("Book1", "Author1"); + //then + assertNotNull(book); + assertEquals("Book1", book.getName()); + assertEquals("Author1", book.getAuthor()); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java new file mode 100644 index 0000000000..0d1efe7129 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/entity/UserUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.entitydtodifferences.entity; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.Arrays; +import java.util.Collections; + +import org.junit.Test; + +public class UserUnitTest { + + @Test + public void whenUserInitialized_thenInitializedCorrectly() { + //when + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2)); + //then + assertNotNull(user); + assertEquals("John", user.getFirstName()); + assertEquals("Doe", user.getLastName()); + assertEquals("123 Main St", user.getAddress()); + assertEquals(2, user.getBooks() + .size()); + } + + @Test + public void givenUserOwningMultipleBooks_whenGetNameOfMostOwnedBook_thenComputedCorrectly() { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + Book book3 = new Book("Book2", "Author3"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2, book3)); + //when + String mostOwnedBook = user.getNameOfMostOwnedBook(); + //then + assertEquals("Book2", mostOwnedBook); + } + + @Test + public void givenUserWithNoBooks_henGetNameOfMostOwnedBook_thenReturnedNull() { + //given + User user = new User("John", "Doe", "123 Main St", Collections.emptyList()); + //when + String mostOwnedBook = user.getNameOfMostOwnedBook(); + //then + assertNull(mostOwnedBook); + } +} diff --git a/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java new file mode 100644 index 0000000000..5154898877 --- /dev/null +++ b/spring-boot-modules/spring-boot-crud/src/test/java/com/baeldung/entitydtodifferences/mapper/UserMapperUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.entitydtodifferences.mapper; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +import com.baeldung.entitydtodifferences.dto.BookDto; +import com.baeldung.entitydtodifferences.dto.UserCreationDto; +import com.baeldung.entitydtodifferences.dto.UserResponseDto; +import com.baeldung.entitydtodifferences.entity.Book; +import com.baeldung.entitydtodifferences.entity.User; + +public class UserMapperUnitTest { + + @Test + public void givenUserEntity_whenMappedToDto_thenMappedCorrectly() { + //given + Book book1 = new Book("Book1", "Author1"); + Book book2 = new Book("Book2", "Author2"); + User user = new User("John", "Doe", "123 Main St", Arrays.asList(book1, book2)); + //when + UserResponseDto userDto = UserMapper.toDto(user); + //then + assertEquals(user.getId(), userDto.getId()); + assertEquals(user.getFirstName(), userDto.getFirstName()); + assertEquals(user.getLastName(), userDto.getLastName()); + List bookDtos = userDto.getBooks(); + assertEquals(2, bookDtos.size()); + assertEquals(book1.getName(), bookDtos.get(0) + .getName()); + assertEquals(book1.getAuthor(), bookDtos.get(0) + .getAuthor()); + assertEquals(book2.getName(), bookDtos.get(1) + .getName()); + assertEquals(book2.getAuthor(), bookDtos.get(1) + .getAuthor()); + } + + @Test + public void givenUserDto_whenMappedToEntity_thenMappedCorrectly() { + //given + BookDto bookDto1 = new BookDto("Book3", "Author3"); + BookDto bookDto2 = new BookDto("Book4", "Author4"); + UserCreationDto userDto = new UserCreationDto("Jane", "Doe", "456 Oak St", Arrays.asList(bookDto1, bookDto2)); + //when + User user = UserMapper.toEntity(userDto); + //then + assertEquals(user.getFirstName(), userDto.getFirstName()); + assertEquals(user.getLastName(), userDto.getLastName()); + assertEquals(user.getAddress(), userDto.getAddress()); + List books = user.getBooks(); + assertEquals(2, books.size()); + assertEquals(bookDto1.getName(), books.get(0) + .getName()); + assertEquals(bookDto1.getAuthor(), books.get(0) + .getAuthor()); + assertEquals(bookDto2.getName(), books.get(1) + .getName()); + assertEquals(bookDto2.getAuthor(), books.get(1) + .getAuthor()); + } + + @Test + public void givenBookEntity_whenMappedToDto_thenMappedCorrectly() { + //given + Book book = new Book("Book5", "Author5"); + //when + BookDto bookDto = UserMapper.toDto(book); + //then + assertEquals(book.getName(), bookDto.getName()); + assertEquals(book.getAuthor(), bookDto.getAuthor()); + } + + @Test + public void givenBookDto_whenMappedToEntity_thenMappedCorrectly() { + //given + BookDto bookDto = new BookDto("Book6", "Author6"); + //when + Book book = UserMapper.toEntity(bookDto); + //then + assertEquals(bookDto.getName(), book.getName()); + assertEquals(bookDto.getAuthor(), book.getAuthor()); + } +} From 720789d02679baac9f3e4d9dd3036c030124e190 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 1 Dec 2023 09:14:50 +0000 Subject: [PATCH 741/831] MismatchedInputException: Cannot deserialize instance --- .../mismatchedinputexception/Animals.java | 27 +++++++++++++ .../mismatchedinputexception/Book.java | 27 +++++++++++++ .../MismatchedinputExceptionUnitTest.java | 39 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java create mode 100644 jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java create mode 100644 jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java new file mode 100644 index 0000000000..1ad1014414 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Animals.java @@ -0,0 +1,27 @@ +package com.baeldung.mismatchedinputexception; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Animals { + + private final int id; + private String name; + + + public Animals(@JsonProperty("id") int id, @JsonProperty("name")String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java new file mode 100644 index 0000000000..28fe118ac5 --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/main/java/com/baeldung/mismatchedinputexception/Book.java @@ -0,0 +1,27 @@ +package com.baeldung.mismatchedinputexception; + +public class Book { + + private int id; + private String title; + + public Book(int id, String title) { + this.id = id; + this.title = title; + } + + public Book() { + } + + public int getId() { + return id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java new file mode 100644 index 0000000000..178ad1a8db --- /dev/null +++ b/jackson-modules/jackson-exceptions/src/test/java/com/baeldung/mismatchedinputexception/MismatchedinputExceptionUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.mismatchedinputexception; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MismatchedinputExceptionUnitTest { + + @Test + void givenJsonString_whenDeserializingToJavaObjectWithImmutableField_thenIdIsCorrect() throws JsonProcessingException { + String jsonString = "{\"id\":10,\"name\":\"Dog\"}"; + ObjectMapper mapper = new ObjectMapper(); + Animals animal = mapper.readValue(jsonString, Animals.class); + assertEquals(animal.getId(),10); + } + + @Test + void givenJsonString_whenDeserializingToBook_thenIdIsCorrect() throws JsonProcessingException { + String jsonString = "{\"id\":\"10\",\"title\":\"Harry Potter\"}"; + ObjectMapper mapper = new ObjectMapper(); + Book book = mapper.readValue(jsonString, Book.class); + assertEquals(book.getId(),10); + } + + + @Test + void givenJsonString_whenDeserializingToBookList_thenTitleIsCorrect() throws JsonProcessingException { + String jsonString = "[{\"id\":\"10\",\"title\":\"Harry Potter\"}]"; + ObjectMapper mapper = new ObjectMapper(); + List book = mapper.readValue(jsonString, new TypeReference>(){}); + assertEquals(book.get(0).getTitle(),"Harry Potter"); + } + +} \ No newline at end of file From c7118d9960e7734d63f3391404ba4f2087dbcafc Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:16:51 +0200 Subject: [PATCH 742/831] [JAVA-27541] Upgraded spring-quartz to spring boot 3 (#15322) --- spring-quartz/pom.xml | 4 ++-- .../baeldung/springquartz/basics/scheduler/QrtzScheduler.java | 2 +- .../springquartz/basics/scheduler/SpringQrtzScheduler.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index e8919bfadb..ddae53f64f 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java index ccf9fca8c1..37bd82ef3b 100644 --- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java +++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/QrtzScheduler.java @@ -6,7 +6,7 @@ import static org.quartz.TriggerBuilder.newTrigger; import java.io.IOException; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory; import org.quartz.*; diff --git a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java index f824765efe..c113482c76 100644 --- a/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java +++ b/spring-quartz/src/main/java/org/baeldung/springquartz/basics/scheduler/SpringQrtzScheduler.java @@ -1,6 +1,6 @@ package org.baeldung.springquartz.basics.scheduler; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import javax.sql.DataSource; import org.baeldung.springquartz.config.AutoWiringSpringBeanJobFactory; From 6508331a74b68db3a1a02ca2ff214f060c30d6f7 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:19:46 +0200 Subject: [PATCH 743/831] [JAVA-27538] Upgraded spring-shell to spring boot 3 (#15328) --- spring-shell/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml index 24fe5b0fb6..bdd495b836 100644 --- a/spring-shell/pom.xml +++ b/spring-shell/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-3 From ef76f798fb016a3f2899faf0be2715d7763ac863 Mon Sep 17 00:00:00 2001 From: Singh Harpal Date: Fri, 1 Dec 2023 17:51:41 +0530 Subject: [PATCH 744/831] JAVA-26769: Update/Migrate to new version of Junit4 --- core-java-modules/core-java-collections-maps-6/pom.xml | 2 +- core-java-modules/core-java-numbers-conversions/pom.xml | 2 +- maven-modules/dependency-exclusion/pom.xml | 2 +- microservices-modules/rest-express/pom.xml | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index 8c35dcee6e..0d1732edb4 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -40,7 +40,7 @@ junit junit - 4.13.1 + ${junit.version} test diff --git a/core-java-modules/core-java-numbers-conversions/pom.xml b/core-java-modules/core-java-numbers-conversions/pom.xml index d014675ead..43809e8453 100644 --- a/core-java-modules/core-java-numbers-conversions/pom.xml +++ b/core-java-modules/core-java-numbers-conversions/pom.xml @@ -27,7 +27,7 @@ junit junit - 4.13.2 + ${junit.version} test diff --git a/maven-modules/dependency-exclusion/pom.xml b/maven-modules/dependency-exclusion/pom.xml index 6e348377b0..6a491e552f 100644 --- a/maven-modules/dependency-exclusion/pom.xml +++ b/maven-modules/dependency-exclusion/pom.xml @@ -62,7 +62,7 @@ junit junit - 4.13 + ${junit.version} diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml index 182d14cfbf..1b22bb8117 100644 --- a/microservices-modules/rest-express/pom.xml +++ b/microservices-modules/rest-express/pom.xml @@ -73,7 +73,7 @@ junit junit - ${junit4.version} + ${junit.version} jar test true @@ -143,7 +143,6 @@ 0.11.3 1.0 0.4.8 - 4.11 2.4.1 2.0 From 76a2939e7db4c9f374d29cb8d860c4e86047eb78 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 1 Dec 2023 12:14:25 -0800 Subject: [PATCH 745/831] JAVA-27645 Check article code matches github (#15323) --- .../baeldung/keyword/InstanceOfUnitTest.java | 18 ++++++------ .../libraries/opencsv/Application.java | 28 +++++++++---------- .../opencsv/OpenCsvIntegrationTest.java | 14 +++++----- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java index 6ba8ed024c..dc81a0290b 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java @@ -11,55 +11,55 @@ import static org.junit.jupiter.api.Assertions.*; public class InstanceOfUnitTest { @Test - void giveWhenInstanceIsCorrect_thenReturnTrue() { + void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); assertTrue(ring instanceof Round); } @Test - void giveWhenObjectIsInstanceOfType_thenReturnTrue() { + void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Circle); } @Test - void giveWhenInstanceIsOfSubtype_thenReturnTrue() { + void givenWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Round); } @Test - void giveWhenTypeIsInterface_thenReturnTrue() { + void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); assertTrue(circle instanceof Shape); } @Test - void giveWhenTypeIsOfObjectType_thenReturnTrue() { + void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); assertTrue(thread instanceof Object); } @Test - void giveWhenInstanceValueIsNull_thenReturnFalse() { + void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; assertFalse(circle instanceof Round); } @Test - void giveWhenComparingClassInDiffHierarchy_thenCompilationError() { + void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { //assertFalse( circle instanceof Triangle); } @Test - void giveWhenStream_whenCastWithoutInstanceOfChk_thenGetException() { + void givenWhenStream_whenCastWithoutInstanceOfChk_thenGetException() { Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle()); assertThrows(ClassCastException.class, () -> roundStream.map(it -> (Ring) it).collect(Collectors.toList())); } @Test - void giveWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() { + void givenWhenStream_whenCastAfterInstanceOfChk_thenGetExpectedResult() { Stream roundStream = Stream.of(new Ring(), new Ring(), new Circle()); List ringList = roundStream.filter(it -> it instanceof Ring).map(it -> (Ring) it).collect(Collectors.toList()); assertEquals(2, ringList.size()); 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 cee73f674e..e18277b328 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 @@ -14,52 +14,52 @@ import java.util.List; public class Application { // CSV Reader Examples - public static List readLineByLineSyncExample() throws Exception { + public static List readLineByLineExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return CsvReaderExamples.readLineByLine(path); } - public static List readAllLinesSyncExample() throws Exception { + public static List readAllLinesExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return CsvReaderExamples.readAllLines(path); } // CSV Writer Examples - public static String writeLineByLineSyncExample() throws Exception { + public static String writeLineByLineExample() throws Exception { Path path = Helpers.fileOutOnePath(); return CsvWriterExamples.writeLineByLine(Helpers.fourColumnCsvString(), path); } - public static String writeAllLinesSyncExample() throws Exception { + public static String writeAllLinesExample() throws Exception { Path path = Helpers.fileOutAllPath(); return CsvWriterExamples.writeAllLines(Helpers.fourColumnCsvString(), path); } // Bean Examples - public static List simpleSyncPositionBeanExample() throws Exception { + public static List simplePositionBeanExample() throws Exception { Path path = Helpers.twoColumnCsvPath(); return BeanExamples.beanBuilderExample(path, SimplePositionBean.class); } - public static List namedSyncColumnBeanExample() throws Exception { + public static List namedColumnBeanExample() throws Exception { Path path = Helpers.namedColumnCsvPath(); return BeanExamples.beanBuilderExample(path, NamedColumnBean.class); } - public static String writeSyncCsvFromBeanExample() throws Exception { + public static String writeCsvFromBeanExample() throws Exception { Path path = Helpers.fileOutBeanPath(); return BeanExamples.writeCsvFromBean(path); } public static void main(String[] args) { try { - simpleSyncPositionBeanExample(); - namedSyncColumnBeanExample(); - writeSyncCsvFromBeanExample(); - readLineByLineSyncExample(); - readAllLinesSyncExample(); - writeLineByLineSyncExample(); - writeAllLinesSyncExample(); + simplePositionBeanExample(); + namedColumnBeanExample(); + writeCsvFromBeanExample(); + readLineByLineExample(); + readAllLinesExample(); + writeLineByLineExample(); + writeAllLinesExample(); } catch (Exception e) { throw new RuntimeException("Error during csv processing", e); } 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 6745b9be7f..c3c85c5baa 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 @@ -13,7 +13,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadUsingPosition_thenContentsRead() throws Exception { - List values = Application.simpleSyncPositionBeanExample(); + List values = Application.simplePositionBeanExample(); assertThat(values) .extracting(Object::toString) @@ -28,7 +28,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadUsingNamedColumn_thenContentsRead() throws Exception { - List values = Application.namedSyncColumnBeanExample(); + List values = Application.namedColumnBeanExample(); assertThat(values) .extracting(Object::toString) @@ -41,7 +41,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadLineByLine_thenContentsRead() throws Exception { - List lineByLineContents = Application.readLineByLineSyncExample(); + List lineByLineContents = Application.readLineByLineExample(); assertThat(lineByLineContents) .containsExactly( @@ -56,7 +56,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenReadAllLines_thenContentsRead() throws Exception { - List contents = Application.readAllLinesSyncExample(); + List contents = Application.readAllLinesExample(); assertThat(contents) .containsExactly( @@ -70,7 +70,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvUsingBean_thenContentsWritten() throws Exception { - String contents = Application.writeSyncCsvFromBeanExample(); + String contents = Application.writeCsvFromBeanExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( @@ -82,7 +82,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvLineByLine_thenContentsWritten() throws Exception { - String contents = Application.writeLineByLineSyncExample(); + String contents = Application.writeLineByLineExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( @@ -94,7 +94,7 @@ public class OpenCsvIntegrationTest { @Test public void givenSampleData_whenWriteCsvAllLines_thenContentsWritten() throws Exception { - String contents = Application.writeAllLinesSyncExample(); + String contents = Application.writeAllLinesExample(); assertThat(contents.split(NEW_LINE)) .containsExactly( From 0c7025b080732eedc94716cdfaceef634862b556 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Sat, 2 Dec 2023 10:25:25 +0530 Subject: [PATCH 746/831] BAEL-7259: review comments implemented --- persistence-modules/java-harperdb/pom.xml | 6 +++++- pom.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 56b63948c9..318f4b7460 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -29,7 +29,7 @@ com.baeldung java-harperdb - 4.2 + ${haperdb-driver.version} system ${project.basedir}/lib/cdata.jdbc.harperdb.jar @@ -57,4 +57,8 @@ + + 4.2 + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 219fc19071..27fe5947dd 100644 --- a/pom.xml +++ b/pom.xml @@ -818,8 +818,8 @@ pdf performance-tests persistence-modules + persistence-modules/java-harperdb persistence-modules/spring-data-neo4j - persistence-modules/java-harperdb protobuffer quarkus-modules reactive-systems From c8973d8cf3fab40c82c9dca3eb9a18de209388b4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 2 Dec 2023 13:17:07 +0530 Subject: [PATCH 747/831] JAVA-27357 Improve core-java-os build time --- .../test/java/com/baeldung/example/soundapi/AppUnitTest.java | 2 +- .../java/com/baeldung/java9/process/ProcessApiUnitTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java index 27bc750d8a..849f71dc03 100644 --- a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java +++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java @@ -23,7 +23,7 @@ public class AppUnitTest { soundRecorder.build(af); try { soundRecorder.start(); - Thread.sleep(20000); + Thread.sleep(5000); soundRecorder.stop(); } catch (InterruptedException ex) { fail("Exception: " + ex); diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java index c3f390d8ae..dae1a705ed 100644 --- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java +++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessApiUnitTest.java @@ -69,7 +69,7 @@ public class ProcessApiUnitTest { }); }); - Thread.sleep(10000); + Thread.sleep(5000); childProc = ProcessHandle.current().children(); childProc.forEach(procHandle -> { @@ -100,7 +100,7 @@ public class ProcessApiUnitTest { private void waistCPU() throws NoSuchAlgorithmException { ArrayList randArr = new ArrayList(4096); SecureRandom sr = SecureRandom.getInstanceStrong(); - Duration somecpu = Duration.ofMillis(4200L); + Duration somecpu = Duration.ofMillis(2000L); Instant end = Instant.now().plus(somecpu); while (Instant.now().isBefore(end)) { // System.out.println(sr.nextInt()); From 9b744641be519dd9e16ca73b11f25b918f0c3c17 Mon Sep 17 00:00:00 2001 From: panos-kakos Date: Sat, 2 Dec 2023 11:16:12 +0200 Subject: [PATCH 748/831] [JAVA-26711] --- .../src/main/resources/application.yml | 2 +- .../spring-boot-libraries/src/main/resources/schema.sql | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml index 3477520208..03c24f7778 100644 --- a/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: datasource: driverClassName: org.h2.Driver - url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + url: jdbc:h2:mem:shedlock_db;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: diff --git a/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql new file mode 100644 index 0000000000..d5a5d51b74 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries/src/main/resources/schema.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS shedlock( + name VARCHAR(64) NOT NULL, + lock_until TIMESTAMP NOT NULL, + locked_at TIMESTAMP NOT NULL, + locked_by VARCHAR(255) NOT NULL, + PRIMARY KEY (name) +); \ No newline at end of file From cf033c3934545e5327e0e40e06a58c836b5985e8 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 12:01:10 +0100 Subject: [PATCH 749/831] rename and improve test whenSolve_thenScoreIsOptimalAndAllShiftsAssigned --- .../baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index 8b57fb42b6..f0cf126236 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; import ai.timefold.solver.core.config.solver.SolverConfig; @@ -21,7 +22,7 @@ public class ShiftScheduleSolverUnitTest { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); @Test - public void solve() { + public void whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) @@ -32,6 +33,7 @@ public class ShiftScheduleSolverUnitTest { ShiftSchedule problem = loadProblem(); ShiftSchedule solution = solver.solve(problem); + assertThat(solution.getScore()).isEqualTo(HardSoftScore.ZERO); assertThat(solution.getShifts().size()).isNotZero(); for (Shift shift : solution.getShifts()) { assertThat(shift.getEmployee()).isNotNull(); From 9e8f67ad03ba65f772f390ff6b1035353742091f Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 12:03:19 +0100 Subject: [PATCH 750/831] Improve forEachUniquePair comment further --- .../timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index fbe6ebccaf..2f929ace34 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -21,7 +21,7 @@ class ShiftScheduleConstraintProviderUnitTest { constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) // Penalizes by 2 because both {shiftA, shiftB} and {shiftB, shiftA} match. - // To avoid that, use forEachUniquePair() in the constraint instead of forEach().join() in the implementation. + // To avoid that, use forEachUniquePair(Shift) instead of forEach(Shift).join(Shift) in ShiftScheduleConstraintProvider.atMostOneShiftPerDay(). .penalizesBy(2); } From f2adeb59566c6e9660004e2afc0bba8b9108d40b Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Sat, 2 Dec 2023 20:20:40 +0100 Subject: [PATCH 751/831] BDD style --- .../ShiftScheduleConstraintProviderUnitTest.java | 8 ++++---- .../timefoldsolver/ShiftScheduleSolverUnitTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java index 2f929ace34..c8ec5b53c4 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleConstraintProviderUnitTest.java @@ -16,7 +16,7 @@ class ShiftScheduleConstraintProviderUnitTest { ShiftSchedule.class, Shift.class); @Test - void whenTwoShiftsOnOneDay_thenPenalize() { + void givenTwoShiftsOnOneDay_whenApplyingAtMostOneShiftPerDayConstraint_thenPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(MONDAY.atTime(14, 0), MONDAY.atTime(22, 0), null, ann)) @@ -26,7 +26,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenTwoShiftsOnDifferentDays_thenDoNotPenalize() { + void givenTwoShiftsOnDifferentDays_whenApplyingAtMostOneShiftPerDayConstraint_thenDoNotPenalize() { Employee ann = new Employee("Ann", null); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::atMostOneShiftPerDay) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), null, ann), new Shift(TUESDAY.atTime(14, 0), TUESDAY.atTime(22, 0), null, ann)) @@ -34,7 +34,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenEmployeeLacksRequiredSkill_thenPenalize() { + void givenEmployeeLacksRequiredSkill_whenApplyingRequiredSkillConstraint_thenPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Cook", ann)) @@ -42,7 +42,7 @@ class ShiftScheduleConstraintProviderUnitTest { } @Test - void whenEmployeeHasRequiredSkill_thenDoNotPenalize() { + void givenEmployeeHasRequiredSkill_whenApplyingRequiredSkillConstraint_thenDoNotPenalize() { Employee ann = new Employee("Ann", Set.of("Waiter")); constraintVerifier.verifyThat(ShiftScheduleConstraintProvider::requiredSkill) .given(ann, new Shift(MONDAY.atTime(6, 0), MONDAY.atTime(14, 0), "Waiter", ann)) diff --git a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java index f0cf126236..873ce1a853 100644 --- a/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java +++ b/timefold-solver/src/test/java/com/baeldung/timefoldsolver/ShiftScheduleSolverUnitTest.java @@ -22,7 +22,7 @@ public class ShiftScheduleSolverUnitTest { private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class); @Test - public void whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { + public void given3Employees5Shifts_whenSolve_thenScoreIsOptimalAndAllShiftsAssigned() { SolverFactory solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class) .withEntityClasses(Shift.class) .withConstraintProviderClass(ShiftScheduleConstraintProvider.class) From d8c84e0ea2546fcd6b34e441ebc7f46a80b7c7ab Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Sat, 2 Dec 2023 19:05:17 -0700 Subject: [PATCH 752/831] [BAEL-7170] Examples of colon character in Java (#15298) --- .../baeldung/colonexamples/ColonExamples.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java diff --git a/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java new file mode 100644 index 0000000000..873e28c3f6 --- /dev/null +++ b/core-java-modules/core-java-lang-operators-2/src/main/java/com/baeldung/colonexamples/ColonExamples.java @@ -0,0 +1,178 @@ +package com.baeldung.colonexamples; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Examples of the different ways Java uses the colon (:) character. + */ +public class ColonExamples { + + private final static Logger LOG = LoggerFactory.getLogger(ColonExamples.class); + + public void example1_enhancedForLoop() { + + // Original style + for(int i = 0; i < 10; i++) { + // do something + } + + // Using enhanced for loop + int[] numbers = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; + for(int i : numbers) { + // do something + } + + // Using List instead of array + List numbersList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); + for(Integer i : numbersList) { + // do something + } + } + + public void example2_switchStatement(String animal) { + + // Original style + if(animal.equals("cat")) { + System.out.println("meow"); + } + else if(animal.equals("lion")) { + System.out.println("roar"); + } + else if(animal.equals("dog") || animal.equals("seal")) { + System.out.println("bark"); + } + else { + System.out.println("unknown"); + } + + // Using switch statement + switch(animal) { + case "cat": + System.out.println("meow"); + break; + case "lion": + System.out.println("roar"); + break; + case "dog": + case "seal": + System.out.println("bark"); + break; + default: + System.out.println("unknown"); + } + } + + public void example3_labels() { + + // For loops without labels + for(int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + if (checkSomeCondition()) { + break; + } + } + } + + outterLoop: for(int i = 0; i < 10; i++) { + innerLoop: for (int j = 0; j < 10; j++) { + if (checkSomeCondition()) { + break outterLoop; + } + } + } + } + + public void example4_ternaryOperator() { + + // Original way using if/else + int x; + if(checkSomeCondition()) { + x = 1; + } + else { + x = 2; + } + + // Using ternary operator + x = checkSomeCondition() ? 1 : 2; + + // Using with other statements + boolean remoteCallResult = callRemoteApi(); + LOG.info(String.format( + "The result of the remote API call %s successful", + remoteCallResult ? "was" : "was not" + )); + } + + public void example5_methodReferences() { + // Original way without lambdas and method references + List names = Arrays.asList("ross", "joey", "chandler"); + List upperCaseNames = new ArrayList<>(); + for(String name : names) { + upperCaseNames.add(name.toUpperCase()); + } + + // Using method reference with stream map operation + List petNames = Arrays.asList("ross", "joey", "chandler"); + List petUpperCaseNames = petNames + .stream() + .map(String::toUpperCase) + .collect(Collectors.toList()); + + // Method reference with stream filter + List pets = Arrays.asList(new Cat(), new Dog(), new Parrot()); + List onlyDogs = pets + .stream() + .filter(Dog.class::isInstance) + .collect(Collectors.toList()); + + // Method reference with constructors + Set onlyDogsSet = pets + .stream() + .filter(Dog.class::isInstance) + .collect(Collectors.toCollection(TreeSet::new)); + } + + public void example6_asserttion() { + // Original way without assertions + Connection conn = getConnection(); + if(conn == null) { + throw new RuntimeException("Connection is null"); + } + + // Using assert keyword + assert getConnection() != null : "Connection is null"; + } + + private boolean checkSomeCondition() { + return new Random().nextBoolean(); + } + + private boolean callRemoteApi() { + return new Random().nextBoolean(); + } + + private Connection getConnection() { + return null; + } + + private static interface Animal { + + } + private static class Dog implements Animal { + + } + + private static class Cat implements Animal { + + } + + private static class Parrot implements Animal { + + } +} From 722180e2a84c2d445ba9d9fa75d8da45a5e2a547 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:03:41 +0800 Subject: [PATCH 753/831] Update README.md [skip ci] --- gradle-modules/gradle-7/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle-modules/gradle-7/README.md b/gradle-modules/gradle-7/README.md index fe05a4b9bc..c452ee8b33 100644 --- a/gradle-modules/gradle-7/README.md +++ b/gradle-modules/gradle-7/README.md @@ -5,4 +5,5 @@ - [Working With Multiple Repositories in Gradle](https://www.baeldung.com/java-gradle-multiple-repositories) - [Different Dependency Version Declarations in Gradle](https://www.baeldung.com/gradle-different-dependency-version-declarations) - [Generating Javadoc With Gradle](https://www.baeldung.com/java-gradle-javadoc) -- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) \ No newline at end of file +- [Generating WSDL Stubs With Gradle](https://www.baeldung.com/java-gradle-create-wsdl-stubs) +- [Gradle Proxy Configuration](https://www.baeldung.com/gradle-proxy-configuration) From d080d2f9f7413f3e8d4f9c999e100f84f732d50c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:11:07 +0800 Subject: [PATCH 754/831] Update README.md [skip ci] --- core-java-modules/core-java-lang-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md index 91c0e5212c..fe79a8ecd4 100644 --- a/core-java-modules/core-java-lang-6/README.md +++ b/core-java-modules/core-java-lang-6/README.md @@ -9,3 +9,4 @@ This module contains articles about core features in the Java language - [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample) - [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code) - [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects) +- [Return First Non-null Value in Java](https://www.baeldung.com/java-first-non-null) From 894d87b029508d9d4f2d60194cc477964bdfa3bc Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:13:25 +0800 Subject: [PATCH 755/831] Update README.md [skip ci] --- core-java-modules/core-java-security-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-security-4/README.md b/core-java-modules/core-java-security-4/README.md index 236715713b..3c910e50be 100644 --- a/core-java-modules/core-java-security-4/README.md +++ b/core-java-modules/core-java-security-4/README.md @@ -5,4 +5,5 @@ This module contains articles about core Java Security ### Relevant Articles: - [Check if Certificate Is Self-Signed or CA-Signed With Java](https://www.baeldung.com/java-check-certificate-sign) - [Extract CN From X509 Certificate in Java](https://www.baeldung.com/java-extract-common-name-x509-certificate) +- [Check Certificate Name and Alias in Keystore File](https://www.baeldung.com/java-keystore-check-certificate-name-alias) - More articles: [[<-- prev]](/core-java-modules/core-java-security-3) From 2e27265f5a71bb20523c8a5feaf49a0b6ff6512d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:18:44 +0800 Subject: [PATCH 756/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index c9f39dd2fa..7e16f2503d 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -4,5 +4,5 @@ - [How to Write Hashmap to CSV File](https://www.baeldung.com/java-write-hashmap-csv) - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) -- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-max-size) -- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) \ No newline at end of file +- [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) +- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 3327571ab92e88f573dff57b4bc5928692d5f4d8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:20:34 +0800 Subject: [PATCH 757/831] Update README.md [skip ci] --- spring-scheduling/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md index 4ee306c0e0..4c42c60c37 100644 --- a/spring-scheduling/README.md +++ b/spring-scheduling/README.md @@ -5,3 +5,4 @@ - [How To Do @Async in Spring](https://www.baeldung.com/spring-async) - [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally) - [Remote Debugging with IntelliJ IDEA](https://www.baeldung.com/intellij-remote-debugging) +- [Setup Asynchronous Retry Mechanism in Spring](https://www.baeldung.com/spring-async-retry) From cf341070d7e62f51eb56e3f90741a930fafde874 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 13:59:00 +0800 Subject: [PATCH 758/831] Update README.md [skip ci] --- spring-boot-modules/spring-boot-mvc-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-mvc-5/README.md b/spring-boot-modules/spring-boot-mvc-5/README.md index 782adb7b34..c72d72c84f 100644 --- a/spring-boot-modules/spring-boot-mvc-5/README.md +++ b/spring-boot-modules/spring-boot-mvc-5/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects. ### Relevant Articles: - [Enable and Disable Endpoints at Runtime With Spring Boot](https://www.baeldung.com/spring-boot-enable-disable-endpoints-at-runtime) - [Extracting a Custom Header From the Request](https://www.baeldung.com/spring-extract-custom-header-request) +- [Modify Request Body Before Reaching Controller in Spring Boot](https://www.baeldung.com/spring-boot-change-request-body-before-controller) From 3081399bd2a83b9f904d1fe085084214ea5871e8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:02:45 +0800 Subject: [PATCH 759/831] Update README.md [skip ci] --- core-java-modules/core-java-uuid/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-uuid/README.md b/core-java-modules/core-java-uuid/README.md index bd7bd9d9da..a32c1ae04f 100644 --- a/core-java-modules/core-java-uuid/README.md +++ b/core-java-modules/core-java-uuid/README.md @@ -6,3 +6,4 @@ - [Validate UUID String in Java](https://www.baeldung.com/java-validate-uuid-string) - [Generate the Same UUID From a String in Java](https://www.baeldung.com/java-generate-same-uuid-from-string) - [Generating Time Based UUIDs](https://www.baeldung.com/java-generating-time-based-uuids) +- [Generating Unique Positive long Using UUID in Java](https://www.baeldung.com/java-uuid-unique-long-generation) From f53d91745449f1467d49acdc07c0b039d9d6bf9c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:07:32 +0800 Subject: [PATCH 760/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index 7e16f2503d..b4ef933ab8 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -5,4 +5,5 @@ - [How to Get First or Last Entry From a LinkedHashMap in Java](https://www.baeldung.com/java-linkedhashmap-first-last-key-value-pair) - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) - [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) +- [How to Sort LinkedHashMap By Values in Java](https://www.baeldung.com/java-sort-linkedhashmap-using-values) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 5eba53af3876c06c9c4357f435505cce60f00db8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:11:04 +0800 Subject: [PATCH 761/831] Update README.md [skip ci] --- core-java-modules/core-java-datetime-conversion/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md index c7ba333222..f30a21f84c 100644 --- a/core-java-modules/core-java-datetime-conversion/README.md +++ b/core-java-modules/core-java-datetime-conversion/README.md @@ -11,3 +11,4 @@ This module contains articles about converting between Java date and time object - [Conversion From 12-Hour Time to 24-Hour Time in Java](https://www.baeldung.com/java-convert-time-format) - [Convert Epoch Time to LocalDate and LocalDateTime](https://www.baeldung.com/java-convert-epoch-localdate) - [Convert Timestamp String to Long in Java](https://www.baeldung.com/java-convert-timestamp-string-long) +- [Convert Long Timestamp to LocalDateTime in Java](https://www.baeldung.com/java-convert-long-timestamp-localdatetime) From 0adcb51cc10771d439ec813e30e944184657f8e8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:13:05 +0800 Subject: [PATCH 762/831] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-7/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-7/README.md b/core-java-modules/core-java-collections-maps-7/README.md index b4ef933ab8..73b36394a3 100644 --- a/core-java-modules/core-java-collections-maps-7/README.md +++ b/core-java-modules/core-java-collections-maps-7/README.md @@ -6,4 +6,5 @@ - [How to Write and Read a File with a Java HashMap](https://www.baeldung.com/java-hashmap-write-read-file) - [Limiting the Max Size of a HashMap in Java](https://www.baeldung.com/java-hashmap-size-bound) - [How to Sort LinkedHashMap By Values in Java](https://www.baeldung.com/java-sort-linkedhashmap-using-values) +- [How to Increment a Map Value in Java](https://www.baeldung.com/java-increment-map-value) - More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-6) From 9b5f00295233df9e7f79dc5f3fad8a1b5aa0f8c0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Sun, 3 Dec 2023 14:14:17 +0800 Subject: [PATCH 763/831] Update README.md [skip ci] --- javafx/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javafx/README.md b/javafx/README.md index 7db1478129..d6ea5b226f 100644 --- a/javafx/README.md +++ b/javafx/README.md @@ -7,4 +7,4 @@ This module contains articles about JavaFX. - [Introduction to JavaFx](https://www.baeldung.com/javafx) - [Display Custom Items in JavaFX ListView](https://www.baeldung.com/javafx-listview-display-custom-items) - [Adding EventHandler to JavaFX Button](https://www.baeldung.com/javafx-button-eventhandler) - +- [How to Use a Custom Font in Java](https://www.baeldung.com/java-custom-font) From 692f3b201a8a081664963b039a27ea41f3e5a318 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sun, 3 Dec 2023 07:19:26 +0000 Subject: [PATCH 764/831] Final Static Variables in Java --- .../java/com/baeldung/finalstatic/Bike.java | 14 ++++++++++ .../baeldung/finalstatic/BikeUnitTest.java | 28 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java new file mode 100644 index 0000000000..6467ccc395 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java @@ -0,0 +1,14 @@ +package com.baeldung.finalstatic; + +import java.util.HashMap; + +public class Bike { + public static final int TIRE = 2; + public static final int PEDAL; + public static final HashMap PART = new HashMap<>(); + + static { + PEDAL = 5; + } + +} diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java new file mode 100644 index 0000000000..bd7f578a9a --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.finalstatic; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BikeUnitTest { + + @Test + void givenTireConstantSetUponDeclaration_whenGetTire_thenReturnTwo() { + assertEquals(2, Bike.TIRE); + } + + @Test + void givenPedalConstantSetByStaticBlock_whenGetPedal_thenReturnFive() { + assertEquals(5, Bike.PEDAL); + } + + @Test + void givenPartConstantObject_whenObjectStateChanged_thenCorrect() { + Bike.PART.put("seat", 1); + assertEquals(1, Bike.PART.get("seat")); + + Bike.PART.put("seat", 5); + assertEquals(5, Bike.PART.get("seat")); + } + +} \ No newline at end of file From f763b57b7a00c3f5653e6076173c28156345dd7c Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sun, 3 Dec 2023 11:09:55 +0000 Subject: [PATCH 765/831] Final Static Variables in Java --- .../src/test/java/com/baeldung/finalstatic/BikeUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java index bd7f578a9a..3699a061ab 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.finalstatic; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class BikeUnitTest { From 7f1bfe6a875067c655b384aa202f5c43daa93f36 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sun, 3 Dec 2023 17:55:52 +0100 Subject: [PATCH 766/831] [chk-double-is-int] check if doulbe is integer (#15312) --- core-java-modules/core-java-numbers-7/pom.xml | 37 +++++++++ .../CheckDoubleIsAnIntegerUnitTest.java | 83 +++++++++++++++++++ core-java-modules/pom.xml | 2 +- 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 core-java-modules/core-java-numbers-7/pom.xml create mode 100644 core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java diff --git a/core-java-modules/core-java-numbers-7/pom.xml b/core-java-modules/core-java-numbers-7/pom.xml new file mode 100644 index 0000000000..dec3084108 --- /dev/null +++ b/core-java-modules/core-java-numbers-7/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + core-java-numbers-7 + core-java-numbers-7 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + com.google.guava + guava + ${guava.version} + + + + core-java-numbers-7 + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java new file mode 100644 index 0000000000..90d2c52595 --- /dev/null +++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/doubleisint/CheckDoubleIsAnIntegerUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.doubleisint; + +import com.google.common.math.DoubleMath; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CheckDoubleIsAnIntegerUnitTest { + + boolean notNaNOrInfinity(double d) { + return !(Double.isNaN(d) || Double.isInfinite(d)); + } + + @Test + void whenConvertingToInt_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && (int) d1 == d1; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && (int) d2 == d2; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && (int) d3 == d3; + assertTrue(!d3IsInteger); // <-- fails if exceeding Integer's range + } + + @Test + void whenUsingModuloOperator_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && (d1 % 1) == 0; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && (d2 % 1) == 0; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && (d3 % 1) == 0; + assertTrue(d3IsInteger); + + } + + + @Test + void whenCheckingFloorOrCeilingValue_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = notNaNOrInfinity(d1) && Math.floor(d1) == d1; + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = notNaNOrInfinity(d2) && Math.floor(d2) == d2; + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = notNaNOrInfinity(d3) && Math.floor(d3) == d3; + assertTrue(d3IsInteger); + + } + + @Test + void whenUsingGuava_thenGetExpectedResult() { + double d1 = 42.0D; + boolean d1IsInteger = DoubleMath.isMathematicalInteger(d1); + assertTrue(d1IsInteger); + + double d2 = 42.42D; + boolean d2IsInteger = DoubleMath.isMathematicalInteger(d2); + assertFalse(d2IsInteger); + + double d3 = 2.0D * Integer.MAX_VALUE; + boolean d3IsInteger = DoubleMath.isMathematicalInteger(d3); + assertTrue(d3IsInteger); + + boolean isInfinityInt = DoubleMath.isMathematicalInteger(Double.POSITIVE_INFINITY); + assertFalse(isInfinityInt); + + boolean isNanInt = DoubleMath.isMathematicalInteger(Double.NaN); + assertFalse(isNanInt); + } +} \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index b3ef8167a5..c0c44eba9a 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -166,6 +166,7 @@ core-java-numbers-4 core-java-numbers-5 core-java-numbers-6 + core-java-numbers-7 core-java-optional core-java-perf core-java-properties @@ -225,5 +226,4 @@ - From e6501ada078ccf1c2c281be027168ad69408eee9 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 3 Dec 2023 21:19:12 +0200 Subject: [PATCH 767/831] JAVA-26705 Upgrade lombok to latest version (#15305) Co-authored-by: timis1 --- aws-modules/aws-reactive/pom.xml | 1 - core-java-modules/core-java-collections-list-5/pom.xml | 2 +- deeplearning4j/pom.xml | 1 - ksqldb/pom.xml | 2 +- kubernetes-modules/k8s-admission-controller/pom.xml | 1 + libraries-data-db/pom.xml | 1 + logging-modules/logback/pom.xml | 1 - messaging-modules/postgres-notify/pom.xml | 1 + .../messaging/postgresql/controller/OrdersController.java | 2 +- .../messaging/postgresql/service/NotificationHandler.java | 2 +- .../baeldung/messaging/postgresql/service/OrdersService.java | 4 ++-- netflix-modules/mantis/pom.xml | 1 + persistence-modules/fauna/pom.xml | 1 + persistence-modules/r2dbc/pom.xml | 1 + persistence-modules/scylladb/pom.xml | 1 + persistence-modules/spring-boot-persistence-2/pom.xml | 1 + persistence-modules/spring-data-cosmosdb/pom.xml | 1 + persistence-modules/spring-data-elasticsearch/pom.xml | 2 +- persistence-modules/spring-data-mongodb-reactive/pom.xml | 1 + persistence-modules/spring-data-redis/pom.xml | 1 + pom.xml | 2 +- reactive-systems/inventory-service/pom.xml | 1 + reactive-systems/order-service/pom.xml | 1 + reactive-systems/shipping-service/pom.xml | 1 + saas-modules/stripe/pom.xml | 1 + security-modules/sql-injection-samples/pom.xml | 1 + spring-4/pom.xml | 1 + spring-5-webflux/pom.xml | 1 + spring-boot-modules/spring-boot-3-2/pom.xml | 1 + spring-boot-modules/spring-boot-graphql/pom.xml | 1 + .../java/com/baeldung/graphql/intro/SpringContextTest.java | 1 - spring-boot-modules/spring-boot-logging-log4j2/pom.xml | 1 + spring-boot-modules/spring-boot-mvc-birt/pom.xml | 1 + spring-boot-modules/spring-boot-mvc/pom.xml | 1 + .../spring-cloud-archaius-dynamodb-config/pom.xml | 1 - .../spring-cloud-archaius-jdbc-config/pom.xml | 4 ---- .../spring-cloud-eureka-feign-client-integration-test/pom.xml | 1 + spring-core-2/pom.xml | 1 + spring-credhub/pom.xml | 1 + spring-kafka-2/pom.xml | 1 + spring-kafka/pom.xml | 1 + spring-reactive-modules/spring-reactive-2/pom.xml | 1 + spring-reactive-modules/spring-reactive-3/pom.xml | 1 + spring-reactive-modules/spring-reactive-client/pom.xml | 1 + .../spring-reactive-data-couchbase/pom.xml | 1 - spring-reactive-modules/spring-reactive-data/pom.xml | 1 + spring-reactive-modules/spring-reactive-security/pom.xml | 1 + spring-security-modules/spring-security-azuread/pom.xml | 1 + spring-security-modules/spring-security-opa/pom.xml | 1 + spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml | 1 + testing-modules/cucumber/pom.xml | 1 + testing-modules/spring-mockito/pom.xml | 1 + 52 files changed, 46 insertions(+), 18 deletions(-) diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index e6b50cadb2..22bd62c2ee 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -93,7 +93,6 @@ 2.2.1.RELEASE 2.17.283 - 1.18.20 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index c89ad0fad9..c11781eeda 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -39,7 +39,7 @@ org.projectlombok lombok - 1.18.26 + ${lombok.version} provided diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index 875d8cdf85..aab19a166d 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -68,7 +68,6 @@ 0.9.1 4.3.5 - 1.18.20 \ No newline at end of file diff --git a/ksqldb/pom.xml b/ksqldb/pom.xml index e55398d635..ebb3bfa7ee 100644 --- a/ksqldb/pom.xml +++ b/ksqldb/pom.xml @@ -17,7 +17,7 @@ confluent confluent-repo - http://packages.confluent.io/maven/ + https://packages.confluent.io/maven/ diff --git a/kubernetes-modules/k8s-admission-controller/pom.xml b/kubernetes-modules/k8s-admission-controller/pom.xml index 18bf98a830..4c41bf7ca0 100644 --- a/kubernetes-modules/k8s-admission-controller/pom.xml +++ b/kubernetes-modules/k8s-admission-controller/pom.xml @@ -22,6 +22,7 @@ org.projectlombok lombok + ${lombok.version} true diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index ed184d72e0..5f1ff489f4 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -152,6 +152,7 @@ org.projectlombok lombok + ${lombok.version} io.ebean diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index 8df95c18bb..fbd180c74d 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -121,7 +121,6 @@ 2.0.0 1.4.8 2.0.4 - 1.18.22 \ No newline at end of file diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml index 876519f40c..571065b98d 100644 --- a/messaging-modules/postgres-notify/pom.xml +++ b/messaging-modules/postgres-notify/pom.xml @@ -41,6 +41,7 @@ org.projectlombok lombok true + ${lombok.version} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java index 70daa14abd..4a1db320dc 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java @@ -42,7 +42,7 @@ public class OrdersController { public ResponseEntity getOrderById(@PathVariable Long id) { Optional o = orders.findById(id); - if (o.isEmpty()) { + if (!o.isPresent()) { return ResponseEntity.notFound().build(); } diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java index 61b970f3a2..da333b89ff 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java @@ -23,7 +23,7 @@ public class NotificationHandler implements Consumer{ public void accept(PGNotification t) { log.info("Notification received: pid={}, name={}, param={}",t.getPID(),t.getName(),t.getParameter()); Optional order = orders.findById(Long.valueOf(t.getParameter())); - if ( !order.isEmpty()) { + if ( order.isPresent()) { log.info("order details: {}", order.get()); } } diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java index cc369c1f3e..038c2f6492 100644 --- a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java @@ -43,14 +43,14 @@ public class OrdersService { @Transactional(readOnly = true) public Optional findById(Long id) { Optional o = Optional.ofNullable(ordersCache.get(id, Order.class)); - if ( !o.isEmpty() ) { + if ( o.isPresent() ) { log.info("findById: cache hit, id={}",id); return o; } log.info("findById: cache miss, id={}",id); o = repo.findById(id); - if ( o.isEmpty()) { + if ( !o.isPresent()) { return o; } diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml index 351f079481..ed57eed01e 100644 --- a/netflix-modules/mantis/pom.xml +++ b/netflix-modules/mantis/pom.xml @@ -43,6 +43,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index a0626e0cd2..c6350b37d7 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -44,6 +44,7 @@ org.projectlombok lombok provided + ${lombok.version} diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml index 5260bb9860..a2c8e3148d 100644 --- a/persistence-modules/r2dbc/pom.xml +++ b/persistence-modules/r2dbc/pom.xml @@ -52,6 +52,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/scylladb/pom.xml b/persistence-modules/scylladb/pom.xml index f84db87742..66dd89afa9 100644 --- a/persistence-modules/scylladb/pom.xml +++ b/persistence-modules/scylladb/pom.xml @@ -37,6 +37,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml index 7d6b6909c4..9b22e6902c 100644 --- a/persistence-modules/spring-boot-persistence-2/pom.xml +++ b/persistence-modules/spring-boot-persistence-2/pom.xml @@ -74,6 +74,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-data-cosmosdb/pom.xml b/persistence-modules/spring-data-cosmosdb/pom.xml index 30dc4f999c..fbd4af9456 100644 --- a/persistence-modules/spring-data-cosmosdb/pom.xml +++ b/persistence-modules/spring-data-cosmosdb/pom.xml @@ -32,6 +32,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index 91dc3ee4d2..b8edae68d3 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -40,7 +40,7 @@ org.projectlombok lombok - 1.18.28 + ${lombok.version} org.springframework.boot diff --git a/persistence-modules/spring-data-mongodb-reactive/pom.xml b/persistence-modules/spring-data-mongodb-reactive/pom.xml index 85c9a4c4b6..46b2e8067f 100644 --- a/persistence-modules/spring-data-mongodb-reactive/pom.xml +++ b/persistence-modules/spring-data-mongodb-reactive/pom.xml @@ -35,6 +35,7 @@ org.projectlombok lombok + ${lombok.version} io.projectreactor diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index 052935e215..382cdf83f5 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} io.projectreactor diff --git a/pom.xml b/pom.xml index cee9d9125b..73a21684e4 100644 --- a/pom.xml +++ b/pom.xml @@ -1234,7 +1234,7 @@ 3.12.2 3.3.0 3.21.0 - 1.18.28 + 1.18.30 2.1.214 32.1.3-jre 3.3.0 diff --git a/reactive-systems/inventory-service/pom.xml b/reactive-systems/inventory-service/pom.xml index 4aeec24922..baf5151fdc 100644 --- a/reactive-systems/inventory-service/pom.xml +++ b/reactive-systems/inventory-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/reactive-systems/order-service/pom.xml b/reactive-systems/order-service/pom.xml index b9e5d36d3a..b6cfb70678 100644 --- a/reactive-systems/order-service/pom.xml +++ b/reactive-systems/order-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/reactive-systems/shipping-service/pom.xml b/reactive-systems/shipping-service/pom.xml index 5fac674bbc..8f94dabdea 100644 --- a/reactive-systems/shipping-service/pom.xml +++ b/reactive-systems/shipping-service/pom.xml @@ -31,6 +31,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/saas-modules/stripe/pom.xml b/saas-modules/stripe/pom.xml index 44bc5be4a8..77bb912b7b 100644 --- a/saas-modules/stripe/pom.xml +++ b/saas-modules/stripe/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} com.stripe diff --git a/security-modules/sql-injection-samples/pom.xml b/security-modules/sql-injection-samples/pom.xml index 7953e43ebe..37779e0d14 100644 --- a/security-modules/sql-injection-samples/pom.xml +++ b/security-modules/sql-injection-samples/pom.xml @@ -38,6 +38,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 681747c1f6..ad05123543 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -57,6 +57,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml index fe6dbe5292..8a381b250a 100644 --- a/spring-5-webflux/pom.xml +++ b/spring-5-webflux/pom.xml @@ -46,6 +46,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index c85488d44b..e48b232a52 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -79,6 +79,7 @@ org.projectlombok lombok + ${lombok.version} true diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index d3c122709d..b3f27f1b84 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/pom.xml @@ -59,6 +59,7 @@ org.projectlombok lombok + ${lombok.version} com.h2database diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java index 87bebf644c..a2e63a96f8 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java @@ -1,6 +1,5 @@ package com.baeldung.graphql.intro; -import com.baeldung.graphql.intro.GraphqlApplication; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index 31c0f4bd02..de21a99ab3 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -40,6 +40,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml index cc4b7f8283..b2cda67974 100644 --- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok + ${lombok.version} provided diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml index 963cda61b9..ab1c867d66 100644 --- a/spring-boot-modules/spring-boot-mvc/pom.xml +++ b/spring-boot-modules/spring-boot-mvc/pom.xml @@ -92,6 +92,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml index 600fedc774..371b5c2976 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-dynamodb-config/pom.xml @@ -44,7 +44,6 @@ 1.11.407 5.0.3 0.7.6 - 1.18.26 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml index 2871f129b5..1ef57d4be3 100644 --- a/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml +++ b/spring-cloud-modules/spring-cloud-archaius/spring-cloud-archaius-jdbc-config/pom.xml @@ -34,8 +34,4 @@ - - 1.18.26 - - \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml index 08a85d191a..e540645f30 100644 --- a/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml +++ b/spring-cloud-modules/spring-cloud-eureka/spring-cloud-eureka-feign-client-integration-test/pom.xml @@ -74,6 +74,7 @@ org.projectlombok lombok + ${lombok.version} org.testcontainers diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f27b16acc3..a3c793b93a 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -133,6 +133,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/spring-credhub/pom.xml b/spring-credhub/pom.xml index defe378b6b..f257d549bf 100644 --- a/spring-credhub/pom.xml +++ b/spring-credhub/pom.xml @@ -23,6 +23,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.credhub diff --git a/spring-kafka-2/pom.xml b/spring-kafka-2/pom.xml index 05da9418b7..7a4d5a5fea 100644 --- a/spring-kafka-2/pom.xml +++ b/spring-kafka-2/pom.xml @@ -38,6 +38,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.kafka diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index ddef3ca180..6428734de2 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.kafka diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index 90c5300cc8..a5552bfe51 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -37,6 +37,7 @@ org.projectlombok lombok provided + ${lombok.version} org.springframework.boot diff --git a/spring-reactive-modules/spring-reactive-3/pom.xml b/spring-reactive-modules/spring-reactive-3/pom.xml index bf2cdbbf2d..17c9690157 100644 --- a/spring-reactive-modules/spring-reactive-3/pom.xml +++ b/spring-reactive-modules/spring-reactive-3/pom.xml @@ -46,6 +46,7 @@ org.projectlombok lombok + ${lombok.version} org.springframework.boot diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml index 5736ce497f..fe53584cc9 100644 --- a/spring-reactive-modules/spring-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-reactive-client/pom.xml @@ -106,6 +106,7 @@ org.projectlombok lombok + ${lombok.version} org.mockito diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index 2ac8ad19ac..e0b21087fa 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -140,7 +140,6 @@ 2.2.6.RELEASE 2.17.1 - 1.18.26 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index a598315d5d..576a1d9f86 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -53,6 +53,7 @@ org.projectlombok lombok true + ${lombok.version} io.projectreactor diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index cf34b21083..25b9f4c38f 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -41,6 +41,7 @@ org.projectlombok lombok compile + ${lombok.version} org.apache.geronimo.specs diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml index 7e67a7e635..11d6b876c1 100644 --- a/spring-security-modules/spring-security-azuread/pom.xml +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -48,6 +48,7 @@ org.projectlombok lombok true + ${lombok.version} org.springframework.boot diff --git a/spring-security-modules/spring-security-opa/pom.xml b/spring-security-modules/spring-security-opa/pom.xml index a6240f6e69..81c4709124 100644 --- a/spring-security-modules/spring-security-opa/pom.xml +++ b/spring-security-modules/spring-security-opa/pom.xml @@ -23,6 +23,7 @@ org.projectlombok lombok + ${lombok.version} com.google.guava diff --git a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml index eb31723798..9c9d6804ae 100644 --- a/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-web-modules/spring-mvc-forms-thymeleaf/pom.xml @@ -27,6 +27,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml index 6d178b86a3..c1d99bb492 100644 --- a/testing-modules/cucumber/pom.xml +++ b/testing-modules/cucumber/pom.xml @@ -42,6 +42,7 @@ org.projectlombok lombok provided + ${lombok.version} io.cucumber diff --git a/testing-modules/spring-mockito/pom.xml b/testing-modules/spring-mockito/pom.xml index 6283ea2d1f..8e13f511d2 100644 --- a/testing-modules/spring-mockito/pom.xml +++ b/testing-modules/spring-mockito/pom.xml @@ -29,6 +29,7 @@ org.projectlombok lombok + ${lombok.version} From e6c2c4ab6427cbce20aec559ad37e367fabefc95 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 4 Dec 2023 09:15:45 +0000 Subject: [PATCH 768/831] https://jira.baeldung.com/browse/BAEL-7169 --- .../src/test/java/com/baeldung/finalstatic/BikeUnitTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java index 3699a061ab..7b32b0906c 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java @@ -25,4 +25,9 @@ class BikeUnitTest { assertEquals(5, Bike.PART.get("seat")); } + @Test + void givenMathClass_whenAccessingPiConstant_thenVerifyPiValueIsCorrect() { + assertEquals(3.141592653589793, Math.PI); + } + } \ No newline at end of file From 67e11e004e464359406396e1b9bb276b00bfb1d6 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:11:26 +0200 Subject: [PATCH 769/831] [JAVA-27743] Upgraded spring-integration module to spring 6 & java 17 (#15343) --- spring-integration/pom.xml | 26 +++++++++---------- .../baeldung/dsl/JavaDSLFileCopyConfig.java | 18 ++++++------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index abf5cfb3d6..315f549c12 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -17,7 +17,6 @@ - org.springframework.integration spring-integration-core @@ -29,11 +28,6 @@ ${javax-activation.version} true - - javax.mail - mail - ${javax-mail.version} - org.springframework.integration spring-integration-twitter @@ -85,16 +79,21 @@ h2 ${h2.version} - - javax.xml.bind - jaxb-api - ${jaxb-api.version} - org.postgresql postgresql ${postgresql.version} + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.sun.mail + jakarta.mail + ${jakarta.mail.version} + @@ -124,14 +123,13 @@ - 5.1.13.RELEASE + 6.0.0 1.1.4.RELEASE 5.0.13.RELEASE - 1.4.7 1.1.1 2.10 - 2.3.0 42.3.8 + 2.0.1 \ No newline at end of file diff --git a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java index adaeac5386..8afd39e9ab 100644 --- a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java +++ b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java @@ -1,6 +1,7 @@ package com.baeldung.dsl; import java.io.File; +import java.time.Duration; import java.util.Scanner; import java.util.concurrent.TimeUnit; @@ -14,7 +15,6 @@ import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.core.GenericSelector; import org.springframework.integration.core.MessageSource; import org.springframework.integration.dsl.IntegrationFlow; -import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.dsl.Pollers; import org.springframework.integration.dsl.MessageChannels; import org.springframework.integration.file.FileReadingMessageSource; @@ -69,7 +69,7 @@ public class JavaDSLFileCopyConfig { @Bean public IntegrationFlow fileMover() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) .filter(onlyJpgs()) .handle(targetDirectory()) .get(); @@ -77,7 +77,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileMoverWithLambda() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000))) .filter(message -> ((File) message).getName() .endsWith(".jpg")) .handle(targetDirectory()) @@ -92,7 +92,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileMoverWithPriorityChannel() { - return IntegrationFlows.from(sourceDirectory()) + return IntegrationFlow.from(sourceDirectory()) .filter(onlyJpgs()) .channel("alphabetically") .handle(targetDirectory()) @@ -113,7 +113,7 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileReader() { - return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10))) + return IntegrationFlow.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10))) .filter(onlyJpgs()) .channel("holdingTank") .get(); @@ -121,16 +121,16 @@ public class JavaDSLFileCopyConfig { // @Bean public IntegrationFlow fileWriter() { - return IntegrationFlows.from("holdingTank") - .bridge(e -> e.poller(Pollers.fixedRate(1, TimeUnit.SECONDS, 20))) + return IntegrationFlow.from("holdingTank") + .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(1, TimeUnit.SECONDS.toChronoUnit()), Duration.of(20, TimeUnit.SECONDS.toChronoUnit())))) .handle(targetDirectory()) .get(); } // @Bean public IntegrationFlow anotherFileWriter() { - return IntegrationFlows.from("holdingTank") - .bridge(e -> e.poller(Pollers.fixedRate(2, TimeUnit.SECONDS, 10))) + return IntegrationFlow.from("holdingTank") + .bridge(e -> e.poller(Pollers.fixedRate(Duration.of(2, TimeUnit.SECONDS.toChronoUnit()), Duration.of(10, TimeUnit.SECONDS.toChronoUnit())))) .handle(anotherTargetDirectory()) .get(); } From 75afba12d1dcc269cdbeb97060ef6f8a40082b1f Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 4 Dec 2023 13:18:04 +0000 Subject: [PATCH 770/831] BAEL-7240 Add example code for verifying lambda calls with mockito --- .../baeldung/lambdacalls/LambdaExample.java | 26 ++++++++++++ .../lambdacalls/LambdaCallsUnitTest.java | 41 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java create mode 100644 testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java new file mode 100644 index 0000000000..bc6274eb18 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/lambdacalls/LambdaExample.java @@ -0,0 +1,26 @@ +package com.baeldung.lambdacalls; + +import java.util.ArrayList; + +public class LambdaExample { + + private BrickLayer brickLayer = new BrickLayer(); + + static ArrayList bricksList = new ArrayList<>(); + + public void createWall(String bricks){ + Runnable build = () -> brickLayer.layBricks(bricks); + build.run(); + } + + public ArrayList getBricksList(){ + return bricksList; + } + + static class BrickLayer { + void layBricks(String bricks){ + bricksList.add(bricks); + } + } + +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java new file mode 100644 index 0000000000..67127c641c --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/lambdacalls/LambdaCallsUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.lambdacalls; + +import static com.baeldung.lambdacalls.LambdaExample.*; +import static junit.framework.TestCase.assertEquals; +import static org.mockito.Mockito.verify; + +import java.util.ArrayList; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class LambdaCallsUnitTest { + + @Mock + private/**/ BrickLayer brickLayer; + @InjectMocks + private LambdaExample lambdaExample; + + @Test + public void whenCallingALambda_thenTheInvocationCanBeConfirmedWithCorrectArguments(){ + String bricks = "red bricks"; + lambdaExample.createWall(bricks); + verify(brickLayer).layBricks(bricks); + } + + @Test + public void whenCallingALambda_thenCorrectBehaviourIsPerformed(){ + LambdaExample lambdaExample = new LambdaExample(); + String bricks = "red bricks"; + + lambdaExample.createWall(bricks); + ArrayList bricksList = lambdaExample.getBricksList(); + + assertEquals(bricks, bricksList.get(0)); + } + +} From 9bf766f6195b67bb79127d3855ac110a195cf21d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Mon, 4 Dec 2023 11:37:09 -0300 Subject: [PATCH 771/831] BAEL ???? - Intro to XPath with Java - quick fix Based on email feedback. * Changing `childs` to `childNodes` * Changing `nodeList = (NodeList)` to `NodeList nodeList = (NodeList)` --- xml/src/main/java/com/baeldung/xml/DefaultParser.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/DefaultParser.java b/xml/src/main/java/com/baeldung/xml/DefaultParser.java index 83280aa0f2..63e4a453c3 100644 --- a/xml/src/main/java/com/baeldung/xml/DefaultParser.java +++ b/xml/src/main/java/com/baeldung/xml/DefaultParser.java @@ -163,10 +163,10 @@ public class DefaultParser { private void clean(Node node) { - NodeList childs = node.getChildNodes(); + NodeList childNodes = node.getChildNodes(); - for (int n = childs.getLength() - 1; n >= 0; n--) { - Node child = childs.item(n); + for (int n = childNodes.getLength() - 1; n >= 0; n--) { + Node child = childNodes.item(n); short nodeType = child.getNodeType(); if (nodeType == Node.ELEMENT_NODE) From e8c97fd6e57ac7902955516c9f027d6132a6c77f Mon Sep 17 00:00:00 2001 From: Niket Agrawal Date: Mon, 4 Dec 2023 22:05:54 +0530 Subject: [PATCH 772/831] BAEL-7062 - Fetching Index from List using Streams (#14914) * Primary Commit * More Cases covered * Indentation Corrections on POM * Merge Conflict Fixed * Updating as per Jira comments * Correction * Review Comment Implementation * Indentation fixes * Review Comment Implementation * Method removal for Iterators * Test Case Update * Review Comment changes * formatting change * Updating map method * Review comment update * Review Comments * Review Comments --- core-java-modules/core-java-streams-5/pom.xml | 5 ++ .../streams/firstmatchingelement/User.java | 21 ++++++ .../FirstMatchingElementUnitTest.java | 72 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java diff --git a/core-java-modules/core-java-streams-5/pom.xml b/core-java-modules/core-java-streams-5/pom.xml index e217271f4c..33cd69f761 100644 --- a/core-java-modules/core-java-streams-5/pom.xml +++ b/core-java-modules/core-java-streams-5/pom.xml @@ -48,6 +48,11 @@ guava ${guava.version} + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + diff --git a/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java new file mode 100644 index 0000000000..cb29af529a --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/main/java/com/baeldung/streams/firstmatchingelement/User.java @@ -0,0 +1,21 @@ +package com.baeldung.streams.firstmatchingelement; + +public class User { + + private String userName; + private Integer userId; + + public User(Integer userId, String userName) { + this.userId = userId; + this.userName = userName; + } + + public String getUserName() { + return userName; + } + + public Integer getUserId() { + return userId; + } + +} diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java new file mode 100644 index 0000000000..db9415e94b --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/streams/firstmatchingelement/FirstMatchingElementUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.streams.firstmatchingelement; + + +import static org.junit.Assert.assertEquals; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; + +import org.apache.commons.collections4.IterableUtils; +import org.junit.Test; + +import com.google.common.collect.Iterables; + +public class FirstMatchingElementUnitTest { + + private List userList = List.of(new User(1, "David"), new User(2, "John"), new User(3, "Roger"), new User(4, "John")); + private String searchName = "John"; + + @Test + public void whenUsingStream_thenFindFirstMatchingUserIndex() { + AtomicInteger counter = new AtomicInteger(-1); + int index = userList.stream() + .filter(user -> { + counter.getAndIncrement(); + return searchName.equals(user.getUserName()); + }) + .mapToInt(user -> counter.get()) + .findFirst() + .orElse(-1); + + assertEquals(1, index); + } + + @Test + public void whenUsingIntStream_thenFindFirstMatchingUserIndex() { + int index = IntStream.range(0, userList.size() - 1) + .filter(streamIndex -> searchName.equals(userList.get(streamIndex).getUserName())) + .findFirst() + .orElse(-1); + assertEquals(1, index); + } + + @Test + public void whenUsingTakeWhile_thenFindFirstMatchingUserIndex() { + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName().equals(searchName)) + .count(); + assertEquals(1, predicateIndex); + } + + @Test + public void whenUsingTakeWhile_thenFindIndexFromNoMatchingElement() { + List userList = List.of(new User(1, "David"), new User(2, "Vick"), new User(3, "Roger"), new User(4, "James")); + long predicateIndex = userList.stream() + .takeWhile(user -> !user.getUserName().equals(searchName)) + .count(); + assertEquals(4, predicateIndex); + } + + @Test + public void whenUsingGoogleGuava_thenFindFirstMatchingUserIndex() { + int index = Iterables.indexOf(userList, user -> searchName.equals(user.getUserName())); + assertEquals(1, index); + } + + @Test + public void whenUsingApacheCommons_thenFindFirstMatchingUserIndex() { + int index = IterableUtils.indexOf(userList, user -> searchName.equals(user.getUserName())); + assertEquals(1, index); + } +} From cf858a14930d2fa32de16b761f332c9895b1a551 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 5 Dec 2023 07:13:20 +0200 Subject: [PATCH 773/831] Java 27490 (#15217) * [JAVA-27490] Set java.version of JDK 9+ profile to JDK 17 * [JAVA-27490] Removed java.version from modules * [JAVA-27490] Commented modules that are failing * [JAVA-27490] Clean up * [JAVA-27490] Clean up --- .../core-groovy-2/gmavenplus-pom.xml | 1 - core-java-modules/core-java-12/pom.xml | 4 -- core-java-modules/core-java-13/pom.xml | 4 -- core-java-modules/core-java-15/pom.xml | 4 -- .../pom.xml | 1 - core-java-modules/pom.xml | 16 +++--- .../multi-module-caching/pom.xml | 2 - docker-modules/pom.xml | 4 -- httpclient-simple/pom.xml | 1 - jackson-simple/pom.xml | 1 - jhipster-6/bookstore-monolith/pom.xml | 1 - kubernetes-modules/kubernetes-spring/pom.xml | 4 -- lightrun/lightrun-api-service/pom.xml | 4 -- lightrun/lightrun-tasks-service/pom.xml | 4 -- lightrun/lightrun-users-service/pom.xml | 4 -- maven-modules/maven-exec-plugin/pom.xml | 1 - maven-modules/maven-generate-war/pom.xml | 3 - messaging-modules/pom.xml | 4 +- messaging-modules/postgres-notify/pom.xml | 3 - parent-boot-3/pom.xml | 3 - persistence-modules/fauna/pom.xml | 1 - persistence-modules/pom.xml | 10 ++-- persistence-modules/rethinkdb/pom.xml | 4 -- .../spring-data-cassandra-2/pom.xml | 1 - pom.xml | 56 +++++++++---------- .../spring-project/pom.xml | 3 - spring-boot-modules/pom.xml | 2 +- .../spring-boot-cassandre/pom.xml | 1 - spring-boot-modules/spring-boot-redis/pom.xml | 1 - .../spring-boot-telegram/pom.xml | 1 - spring-native/pom-nativeimage.xml | 3 - spring-pulsar/pom.xml | 1 - .../spring-security-azuread/pom.xml | 4 -- .../reactive-resource-server/pom.xml | 4 +- .../servlet-resource-server/pom.xml | 4 +- .../spring-security-saml2/pom.xml | 1 - spring-soap/pom.xml | 1 - .../pom.xml | 1 - spring-vault/pom.xml | 1 - testing-modules/pom.xml | 4 +- 40 files changed, 48 insertions(+), 125 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml index 975ad6f689..256b5e88ab 100644 --- a/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml +++ b/core-groovy-modules/core-groovy-2/gmavenplus-pom.xml @@ -167,7 +167,6 @@ UTF-8 3.9 - 1.8 1.2.3 diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml index 8165549d8c..ae61bdfad0 100644 --- a/core-java-modules/core-java-12/pom.xml +++ b/core-java-modules/core-java-12/pom.xml @@ -21,8 +21,4 @@ - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml index 52cf227583..b8ec8cfdb9 100644 --- a/core-java-modules/core-java-13/pom.xml +++ b/core-java-modules/core-java-13/pom.xml @@ -13,8 +13,4 @@ 0.0.1-SNAPSHOT - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml index 3996c69fa4..e6193b4ea3 100644 --- a/core-java-modules/core-java-15/pom.xml +++ b/core-java-modules/core-java-15/pom.xml @@ -26,8 +26,4 @@ - - 17 - - \ No newline at end of file diff --git a/core-java-modules/core-java-collections-conversions-2/pom.xml b/core-java-modules/core-java-collections-conversions-2/pom.xml index da6b6a564a..7723daa6db 100644 --- a/core-java-modules/core-java-collections-conversions-2/pom.xml +++ b/core-java-modules/core-java-collections-conversions-2/pom.xml @@ -43,7 +43,6 @@ 0.10.3 - 11 3.2.0 \ No newline at end of file diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index c0c44eba9a..d20a1650b9 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -59,16 +59,16 @@ core-java-lang-oop-constructors-2 core-java-methods core-java-networking-3 - core-java-os + core-java-perf-2 core-java-streams-4 core-java-streams-5 core-java-streams-collect core-java-streams-maps core-java-string-algorithms-3 - core-java-string-operations-3 + core-java-string-operations-4 - core-java-string-operations-5 + core-java-time-measurements core-java-annotations @@ -123,13 +123,13 @@ core-java-io core-java-io-2 core-java-io-3 - core-java-io-4 + core-java-io-5 core-java-io-apis core-java-io-apis-2 core-java-io-conversions core-java-jar - core-java-jndi + core-java-jvm core-java-jvm-2 core-java-jvm-3 @@ -144,11 +144,11 @@ core-java-lang-oop-constructors core-java-lang-oop-patterns core-java-lang-oop-generics - core-java-lang-oop-modifiers + core-java-lang-oop-types core-java-lang-oop-types-2 core-java-lang-oop-inheritance - core-java-lang-oop-methods + core-java-lang-oop-others core-java-lang-operators core-java-lang-operators-2 @@ -185,8 +185,8 @@ core-java-string-algorithms core-java-string-algorithms-2 core-java-string-apis + core-java-swing - core-java-string-apis-2 core-java-string-conversions core-java-string-conversions-2 core-java-string-conversions-3 diff --git a/docker-modules/docker-caching/multi-module-caching/pom.xml b/docker-modules/docker-caching/multi-module-caching/pom.xml index bebfb85e8a..f2b52f246d 100644 --- a/docker-modules/docker-caching/multi-module-caching/pom.xml +++ b/docker-modules/docker-caching/multi-module-caching/pom.xml @@ -25,8 +25,6 @@ - UTF-8 - 1.8 32.1.3-jre diff --git a/docker-modules/pom.xml b/docker-modules/pom.xml index b4c5240718..4eeab746eb 100644 --- a/docker-modules/pom.xml +++ b/docker-modules/pom.xml @@ -24,8 +24,4 @@ docker-java-jar - - 11 - - \ No newline at end of file diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml index a0f2dd6514..e0488bf0b1 100644 --- a/httpclient-simple/pom.xml +++ b/httpclient-simple/pom.xml @@ -203,7 +203,6 @@ - 17 1.16.0 diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 2ba3868ee2..daa6504709 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -34,7 +34,6 @@ 2.16.0 - 17 \ No newline at end of file diff --git a/jhipster-6/bookstore-monolith/pom.xml b/jhipster-6/bookstore-monolith/pom.xml index efe3d2a118..0db1f46b1e 100644 --- a/jhipster-6/bookstore-monolith/pom.xml +++ b/jhipster-6/bookstore-monolith/pom.xml @@ -1125,7 +1125,6 @@ 3.0.0 - 11 2.12.6 v10.15.0 6.4.1 diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 05532ab0b0..64322055d1 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -46,8 +46,4 @@ - - 11 - - \ No newline at end of file diff --git a/lightrun/lightrun-api-service/pom.xml b/lightrun/lightrun-api-service/pom.xml index b7ed5f951b..77dbbb8b99 100644 --- a/lightrun/lightrun-api-service/pom.xml +++ b/lightrun/lightrun-api-service/pom.xml @@ -40,8 +40,4 @@ - - 17 - - \ No newline at end of file diff --git a/lightrun/lightrun-tasks-service/pom.xml b/lightrun/lightrun-tasks-service/pom.xml index 2689a9794d..773c81a9d5 100644 --- a/lightrun/lightrun-tasks-service/pom.xml +++ b/lightrun/lightrun-tasks-service/pom.xml @@ -65,8 +65,4 @@ - - 17 - - \ No newline at end of file diff --git a/lightrun/lightrun-users-service/pom.xml b/lightrun/lightrun-users-service/pom.xml index 40594db725..0b3e856069 100644 --- a/lightrun/lightrun-users-service/pom.xml +++ b/lightrun/lightrun-users-service/pom.xml @@ -57,8 +57,4 @@ - - 17 - - \ No newline at end of file diff --git a/maven-modules/maven-exec-plugin/pom.xml b/maven-modules/maven-exec-plugin/pom.xml index 1bac52ae2c..370b344167 100644 --- a/maven-modules/maven-exec-plugin/pom.xml +++ b/maven-modules/maven-exec-plugin/pom.xml @@ -47,7 +47,6 @@ 1.2.6 3.11.0 3.1.0 - 1.8 \ No newline at end of file diff --git a/maven-modules/maven-generate-war/pom.xml b/maven-modules/maven-generate-war/pom.xml index 7de3f15298..d73ffe8b1d 100644 --- a/maven-modules/maven-generate-war/pom.xml +++ b/maven-modules/maven-generate-war/pom.xml @@ -70,10 +70,7 @@ - 11 2.17.1 - 11 - 11 \ No newline at end of file diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 27524637ab..f96d57b960 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -20,8 +20,8 @@ jgroups rabbitmq spring-amqp - spring-apache-camel - spring-jms + + postgres-notify diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml index 571065b98d..a9b930543b 100644 --- a/messaging-modules/postgres-notify/pom.xml +++ b/messaging-modules/postgres-notify/pom.xml @@ -46,9 +46,6 @@ - - 1.8 - diff --git a/parent-boot-3/pom.xml b/parent-boot-3/pom.xml index 9f9d6f7901..f1ab699c83 100644 --- a/parent-boot-3/pom.xml +++ b/parent-boot-3/pom.xml @@ -233,9 +233,6 @@ 3.1.5 5.8.2 0.9.17 - 17 - ${java.version} - ${java.version} 1.4.4 2.0.3 diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index c6350b37d7..4c37c2ae9e 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -58,7 +58,6 @@ - 17 4.2.0 diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index d9ee7e358c..41ff596ccf 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,15 +60,15 @@ solr spring-boot-persistence-2 - spring-boot-persistence-3 - spring-boot-mysql + + spring-boot-persistence spring-boot-persistence-h2 spring-boot-persistence-mongodb spring-boot-persistence-mongodb-2 spring-boot-persistence-mongodb-3 spring-data-arangodb - spring-data-cassandra + spring-data-cassandra-test spring-data-cosmosdb spring-data-couchbase-2 @@ -108,8 +108,8 @@ spring-jpa spring-jpa-2 spring-jdbc - spring-jdbc-2 - spring-jooq + spring-jdbc-2 + spring-mybatis spring-persistence-simple spring-data-yugabytedb diff --git a/persistence-modules/rethinkdb/pom.xml b/persistence-modules/rethinkdb/pom.xml index 17c7036ed3..352be80469 100644 --- a/persistence-modules/rethinkdb/pom.xml +++ b/persistence-modules/rethinkdb/pom.xml @@ -46,8 +46,4 @@ - - 17 - - diff --git a/persistence-modules/spring-data-cassandra-2/pom.xml b/persistence-modules/spring-data-cassandra-2/pom.xml index 01b5ce5ed6..6532da7f95 100644 --- a/persistence-modules/spring-data-cassandra-2/pom.xml +++ b/persistence-modules/spring-data-cassandra-2/pom.xml @@ -99,7 +99,6 @@ - 11 3.4.15 1.19.0 1.1.0 diff --git a/pom.xml b/pom.xml index 73a21684e4..6dc2fdb4c3 100644 --- a/pom.xml +++ b/pom.xml @@ -715,7 +715,7 @@ azure bazel checker-framework - core-groovy-modules + core-java-modules custom-pmd data-structures @@ -756,7 +756,7 @@ jersey jetbrains jgit - jhipster-6 + jib jmeter jmh @@ -800,7 +800,7 @@ lombok-modules lucene mapstruct - maven-modules + mesos-marathon messaging-modules metrics @@ -836,19 +836,19 @@ spring-activiti spring-actuator spring-aop-2 - spring-aop + spring-batch-2 spring-batch spring-boot-modules spring-boot-rest spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker - spring-cloud-modules/spring-cloud-contract - spring-cloud-modules/spring-cloud-data-flow + + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-security - spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-core-2 spring-core-3 @@ -856,14 +856,14 @@ spring-core spring-credhub spring-cucumber - spring-di-2 + spring-di-3 spring-di-4 spring-di spring-drools spring-ejb-modules spring-exceptions - spring-integration + spring-jenkins-pipeline spring-jersey spring-jinq @@ -891,7 +891,7 @@ spring-web-modules spring-websockets - tablesaw + tensorflow-java testing-modules testing-modules/mockito-simple @@ -900,16 +900,16 @@ vertx-modules web-modules webrtc - xml-2 + xml xstream UTF-8 - 11 - 11 - 11 + 17 + 17 + 17 @@ -961,7 +961,7 @@ azure bazel checker-framework - core-groovy-modules + core-java-modules custom-pmd data-structures @@ -1002,7 +1002,7 @@ jersey jetbrains jgit - jhipster-6 + jib jmeter jmh @@ -1046,7 +1046,7 @@ lombok-modules lucene mapstruct - maven-modules + mesos-marathon messaging-modules metrics @@ -1081,19 +1081,19 @@ spring-activiti spring-actuator spring-aop-2 - spring-aop + spring-batch-2 spring-batch spring-boot-modules spring-boot-rest spring-cloud-modules/spring-cloud-azure spring-cloud-modules/spring-cloud-circuit-breaker - spring-cloud-modules/spring-cloud-contract - spring-cloud-modules/spring-cloud-data-flow + + spring-cloud-modules/spring-cloud-eureka spring-cloud-modules/spring-cloud-netflix-feign spring-cloud-modules/spring-cloud-security - spring-cloud-modules/spring-cloud-stream-starters + spring-cloud-modules/spring-cloud-zuul-eureka-integration spring-core-2 spring-core-3 @@ -1101,14 +1101,14 @@ spring-core spring-credhub spring-cucumber - spring-di-2 + spring-di-3 spring-di-4 spring-di spring-drools spring-ejb-modules spring-exceptions - spring-integration + spring-jenkins-pipeline spring-jersey spring-jinq @@ -1135,7 +1135,7 @@ spring-web-modules spring-websockets - tablesaw + tensorflow-java testing-modules testing-modules/mockito-simple @@ -1144,16 +1144,16 @@ vertx-modules web-modules webrtc - xml-2 + xml xstream UTF-8 - 11 - 11 - 11 + 17 + 17 + 17 diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml index 74deab3558..c3ee41223f 100644 --- a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml +++ b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml @@ -253,10 +253,7 @@ 1.17.2 - 11 0.12.1 - 11 - 11 3.1.0 0.9.11 2.0.8 diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 433f23f4ba..eaf04cf015 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -42,7 +42,7 @@ spring-boot-exceptions spring-boot-flowable spring-boot-graphql - spring-boot-groovy + spring-boot-jasypt spring-boot-jsp diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml index e2964183d2..3834d7b88c 100644 --- a/spring-boot-modules/spring-boot-cassandre/pom.xml +++ b/spring-boot-modules/spring-boot-cassandre/pom.xml @@ -40,7 +40,6 @@ - 11 4.2.1 5.0.7 2.5.1 diff --git a/spring-boot-modules/spring-boot-redis/pom.xml b/spring-boot-modules/spring-boot-redis/pom.xml index fa6b5a59c1..57a894e2fc 100644 --- a/spring-boot-modules/spring-boot-redis/pom.xml +++ b/spring-boot-modules/spring-boot-redis/pom.xml @@ -73,7 +73,6 @@ - 15 6.0.3 0.7.3 diff --git a/spring-boot-modules/spring-boot-telegram/pom.xml b/spring-boot-modules/spring-boot-telegram/pom.xml index 9077e90400..a26566819a 100644 --- a/spring-boot-modules/spring-boot-telegram/pom.xml +++ b/spring-boot-modules/spring-boot-telegram/pom.xml @@ -39,7 +39,6 @@ - 17 6.7.0 diff --git a/spring-native/pom-nativeimage.xml b/spring-native/pom-nativeimage.xml index 6d42bedbe1..4fc01e4574 100644 --- a/spring-native/pom-nativeimage.xml +++ b/spring-native/pom-nativeimage.xml @@ -114,9 +114,6 @@ 2.7.1 0.12.1 0.9.17 - 1.8 - 1.8 - 1.8 diff --git a/spring-pulsar/pom.xml b/spring-pulsar/pom.xml index a1c834f830..b2feaddfb1 100644 --- a/spring-pulsar/pom.xml +++ b/spring-pulsar/pom.xml @@ -43,7 +43,6 @@ - 17 0.2.0 diff --git a/spring-security-modules/spring-security-azuread/pom.xml b/spring-security-modules/spring-security-azuread/pom.xml index 11d6b876c1..b32a1eb16a 100644 --- a/spring-security-modules/spring-security-azuread/pom.xml +++ b/spring-security-modules/spring-security-azuread/pom.xml @@ -11,10 +11,6 @@ spring-security-azuread - - 1.8 - - org.springframework.boot diff --git a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml index 3d5ff0cb69..a5ce06f4d9 100644 --- a/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/reactive-resource-server/pom.xml @@ -12,9 +12,7 @@ reactive-resource-server reactive-resource-server Demo project for Spring Boot reactive resource-server - - 17 - + org.springframework.boot diff --git a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml index eb507fc3d3..44403cf341 100644 --- a/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml +++ b/spring-security-modules/spring-security-oauth2-testing/servlet-resource-server/pom.xml @@ -12,9 +12,7 @@ servlet-resource-server servlet-resource-server Demo project for Spring Boot servlet resource-server - - 17 - + org.springframework.boot diff --git a/spring-security-modules/spring-security-saml2/pom.xml b/spring-security-modules/spring-security-saml2/pom.xml index 6de69fd201..64a4e22627 100644 --- a/spring-security-modules/spring-security-saml2/pom.xml +++ b/spring-security-modules/spring-security-saml2/pom.xml @@ -82,7 +82,6 @@ - 17 4.1.1 diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml index 6c49f1f39c..c796b08e9a 100644 --- a/spring-soap/pom.xml +++ b/spring-soap/pom.xml @@ -102,7 +102,6 @@ - 17 4.0.0 3.1.0 0.15.3 diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index ded02da62c..b1c2bf61f1 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -83,7 +83,6 @@ - 11 3.0.0 2.17.1 1.7.0 diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index b3690c7b7f..768303cb4b 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -83,7 +83,6 @@ 2.3.4 2.20.140 3.1.3 - 17 \ No newline at end of file diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index fa72b1e696..b2e73570d5 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -34,8 +34,8 @@ load-testing-comparison mockito - mocks - mocks-2 + + mockserver parallel-tests-junit powermock From d935c4fe23efbfd30039e81b3ce6fd186841922b Mon Sep 17 00:00:00 2001 From: Sameer Date: Tue, 5 Dec 2023 12:04:33 +0530 Subject: [PATCH 774/831] BAEL 7138 Difference between String and StringBuffer in Java (#15351) * string vs stringBuffer comparison * BAEL-7138 Difference between String and StringBuffer in Java --------- Co-authored-by: Sahil --- .../main/java/com/baeldung/stringbuffer/ComparePerformance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java index 28cd2e64e9..4d045fe318 100644 --- a/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java +++ b/core-java-modules/core-java-strings/src/main/java/com/baeldung/stringbuffer/ComparePerformance.java @@ -28,6 +28,7 @@ public class ComparePerformance { @Benchmark public String benchmarkStringConcatenation() { + strFinal = ""; strFinal += strInitial; return strFinal; } From 9a003c4bf4c2aa9e074e016b7681b879aa2be3a2 Mon Sep 17 00:00:00 2001 From: maenolis Date: Tue, 5 Dec 2023 17:21:04 +0200 Subject: [PATCH 775/831] Unnecessary change revert. --- core-java-modules/core-java-21/pom.xml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-21/pom.xml b/core-java-modules/core-java-21/pom.xml index 98e73c89c0..bfe1cd2c78 100644 --- a/core-java-modules/core-java-21/pom.xml +++ b/core-java-modules/core-java-21/pom.xml @@ -22,7 +22,9 @@ 21 false - --enable-preview + + --enable-preview + @@ -36,15 +38,6 @@ - - - org.mockito - mockito-core - 5.7.0 - test - - - 21 21 From 11c468f576ae5374cb111718436c57d69bd07533 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 6 Dec 2023 03:18:19 +0100 Subject: [PATCH 776/831] [bigdecimal-zero] bigdecimal zero vs constructor (#15355) --- ...BigDecimalZeroVsNewBigDecimalUnitTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java diff --git a/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java new file mode 100644 index 0000000000..a10a615e2f --- /dev/null +++ b/core-java-modules/core-java-numbers-7/src/test/java/com/baeldung/bigdecimalzero/BigDecimalZeroVsNewBigDecimalUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.bigdecimalzero; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; + +public class BigDecimalZeroVsNewBigDecimalUnitTest { + @Test + void whenComparingZeroAndNewBigDecimal_thenGetExpectedResult() { + BigDecimal bd1 = new BigDecimal("42.00"); + BigDecimal bd2 = new BigDecimal("42.0000"); + assertEquals(0, bd1.compareTo(bd2)); + + assertNotEquals(bd1, bd2); + + BigDecimal zero0 = new BigDecimal(0); + assertNotEquals(zero0, new BigDecimal("0.000")); + + BigDecimal zero = BigDecimal.ZERO; + assertEquals(zero, zero0); + } + + @Test + void whenCallingBigDecimalZero_thenAlwaysGetTheSameObject() { + BigDecimal z1 = BigDecimal.ZERO; + BigDecimal z2 = BigDecimal.ZERO; + assertSame(z1, z2); + } + + @Test + void whenCallingNewBigDecimal_thenAlwaysGetTheSameObject() { + BigDecimal z1 = new BigDecimal(0); + BigDecimal z2 = new BigDecimal(0); + assertNotSame(z1, z2); + } + +} \ No newline at end of file From 155389fbc29f6e862104d60bffa1c18cb9e40685 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 6 Dec 2023 14:25:31 +0200 Subject: [PATCH 777/831] [JAVA-27738] (#15363) * [JAVA-27738] Upgraded core-groovy modules to jdk 17 * [JAVA-27738] Re enabled core-groovy modules * [JAVA-27738] Formatting --- core-groovy-modules/core-groovy-2/pom.xml | 11 +++++++++-- pom.xml | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core-groovy-modules/core-groovy-2/pom.xml b/core-groovy-modules/core-groovy-2/pom.xml index de750daf0f..cc1d860ad1 100644 --- a/core-groovy-modules/core-groovy-2/pom.xml +++ b/core-groovy-modules/core-groovy-2/pom.xml @@ -13,6 +13,13 @@ 1.0.0-SNAPSHOT + + + groovy-plugins-release + https://groovy.jfrog.io/artifactory/plugins-release-local + + + org.apache.commons @@ -156,8 +163,8 @@ 1.1.3 3.4.2 3.8.1 - 3.7.0 - 3.0.8-01 + 3.9.0 + 3.0.9-03 diff --git a/pom.xml b/pom.xml index 6dc2fdb4c3..eb780e5168 100644 --- a/pom.xml +++ b/pom.xml @@ -715,7 +715,7 @@ azure bazel checker-framework - + core-groovy-modules core-java-modules custom-pmd data-structures @@ -961,7 +961,7 @@ azure bazel checker-framework - + core-groovy-modules core-java-modules custom-pmd data-structures From b6f45db73d3771fdc4b84fa823eb308fc640e869 Mon Sep 17 00:00:00 2001 From: parthiv39731 <70740707+parthiv39731@users.noreply.github.com> Date: Wed, 6 Dec 2023 18:55:46 +0530 Subject: [PATCH 778/831] BAEL-6910, Renamed to LiveTest --- ...Test.java => CassandraConnectionDetailsLiveTest.java} | 9 +++++++-- ...Test.java => CouchbaseConnectionDetailsLiveTest.java} | 7 ++++++- ....java => ElasticsearchConnectionDetailsLiveTest.java} | 9 +++++++-- ...ationTest.java => JdbcConnectionDetailsLiveTest.java} | 9 +++++++-- ...tionTest.java => KafkaConnectionDetailsLiveTest.java} | 7 ++++++- ...onTest.java => MongoDBConnectionDetailsLiveTest.java} | 7 ++++++- ...tionTest.java => Neo4jConnectionDetailsLiveTest.java} | 7 ++++++- ...tionTest.java => R2dbcConnectionDetailsLiveTest.java} | 9 +++++++-- ...nTest.java => RabbitmqConnectionDetailsLiveTest.java} | 9 +++++++-- ...st.java => RedisCacheConnnectionDetailsLiveTest.java} | 9 +++++++-- 10 files changed, 66 insertions(+), 16 deletions(-) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{CassandraConnectionDetailsIntegrationTest.java => CassandraConnectionDetailsLiveTest.java} (80%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{CouchbaseConnectionDetailsIntegrationTest.java => CouchbaseConnectionDetailsLiveTest.java} (77%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{ElasticsearchConnectionDetailsIntegrationTest.java => ElasticsearchConnectionDetailsLiveTest.java} (81%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{JdbcConnectionDetailsIntegrationTest.java => JdbcConnectionDetailsLiveTest.java} (79%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{KafkaConnectionDetailsIntegrationTest.java => KafkaConnectionDetailsLiveTest.java} (78%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{MongoDBConnectionDetailsIntegrationTest.java => MongoDBConnectionDetailsLiveTest.java} (85%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{Neo4jConnectionDetailsIntegrationTest.java => Neo4jConnectionDetailsLiveTest.java} (81%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{R2dbcConnectionDetailsIntegrationTest.java => R2dbcConnectionDetailsLiveTest.java} (80%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{RabbitmqConnectionDetailsIntegrationTest.java => RabbitmqConnectionDetailsLiveTest.java} (85%) rename spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/{RedisCacheConnnectionDetailsIntegrationTest.java => RedisCacheConnnectionDetailsLiveTest.java} (76%) diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java similarity index 80% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java index 4130b6cb6b..9198cc1f68 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CassandraConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomCassandraConnectionDetailsConfiguration; @@ -22,8 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-cassandra.properties"}) @ActiveProfiles("cassandra") -public class CassandraConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsIntegrationTest.class); +public class CassandraConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(CassandraConnectionDetailsLiveTest.class); @Autowired private CassandraTemplate cassandraTemplate; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java similarity index 77% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java index 454aad4c6c..6f19382950 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/CouchbaseConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomCouchBaseConnectionDetailsConfiguration; @@ -20,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-couch.properties"}) @ActiveProfiles("couch") -public class CouchbaseConnectionDetailsIntegrationTest { +public class CouchbaseConnectionDetailsLiveTest { @Autowired private Cluster cluster; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java similarity index 81% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java index ee698cd6ea..10d0e9d019 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/ElasticsearchConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomElasticsearchConnectionDetailsConfiguration; @@ -24,8 +29,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-elastic.properties"}) @ActiveProfiles("elastic") -public class ElasticsearchConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsIntegrationTest.class); +public class ElasticsearchConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConnectionDetailsLiveTest.class); @Autowired private ElasticsearchTemplate elasticsearchTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java similarity index 79% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java index 748bc27b0b..b074eb9bfd 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/JdbcConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.JdbcConnectionDetailsConfiguration; @@ -25,8 +30,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-jdbc.properties"}) @ActiveProfiles("jdbc") -public class JdbcConnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsIntegrationTest.class); +public class JdbcConnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(JdbcConnectionDetailsLiveTest.class); @Autowired private JdbcTemplate jdbcTemplate; @Test diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java similarity index 78% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java index bc0e174b3f..f23e610d3a 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/KafkaConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomKafkaConnectionDetailsConfiguration; @@ -21,7 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-kafka.properties"}) @ActiveProfiles("kafka") -public class KafkaConnectionDetailsIntegrationTest { +public class KafkaConnectionDetailsLiveTest { @Autowired private KafkaTemplate kafkaTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java similarity index 85% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java index 868ebfea98..e2dceff9ec 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/MongoDBConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.MongoDBConnectionDetailsConfiguration; @@ -26,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-mongo.properties"}) @ActiveProfiles("mongo") -public class MongoDBConnectionDetailsIntegrationTest { +public class MongoDBConnectionDetailsLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java similarity index 81% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java index 943ed7bdea..8eb9ec44d2 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/Neo4jConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.CustomNeo4jConnectionDetailsConfiguration; @@ -22,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @ComponentScan(basePackages = "com.baeldung.connectiondetails") @TestPropertySource(locations = {"classpath:connectiondetails/application-neo4j.properties"}) @ActiveProfiles("neo4j") -public class Neo4jConnectionDetailsIntegrationTest { +public class Neo4jConnectionDetailsLiveTest { @Autowired private Neo4jTemplate neo4jTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java similarity index 80% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java index 5f8c8349fb..460a48e7ff 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/R2dbcConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.R2dbcPostgresConnectionDetailsConfiguration; @@ -20,8 +25,8 @@ import java.util.List; @Import(R2dbcPostgresConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-r2dbc.properties"}) @ActiveProfiles("r2dbc") -public class R2dbcConnectionDetailsIntegrationTest { - Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsIntegrationTest.class); +public class R2dbcConnectionDetailsLiveTest { + Logger logger = LoggerFactory.getLogger(R2dbcConnectionDetailsLiveTest.class); @Autowired private R2dbcEntityTemplate r2dbcEntityTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java similarity index 85% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java index 9e10973ed7..5f7eb055eb 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RabbitmqConnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.RabbitMQConnectionDetailsConfiguration; @@ -25,9 +30,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @Import(RabbitMQConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-rabbitmq.properties"}) @ActiveProfiles("rabbitmq") -public class RabbitmqConnectionDetailsIntegrationTest { +public class RabbitmqConnectionDetailsLiveTest { - private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsIntegrationTest.class); + private static final Logger logger = LoggerFactory.getLogger(RabbitmqConnectionDetailsLiveTest.class); @Autowired private RabbitTemplate rabbitTemplate; diff --git a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java similarity index 76% rename from spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java index 5dbd2d6c03..919f968323 100644 --- a/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/connectiondetails/RedisCacheConnnectionDetailsLiveTest.java @@ -1,3 +1,8 @@ +/** + * These test cases have dependency with docker because they pull the docker images from docker hub + * and run the container. So, please make sure to install docker before running the tests. + * For the image details please look into the docker-compose files under resources/connectiondetails/docker + **/ package com.baeldung.connectiondetails; import com.baeldung.connectiondetails.configuration.RedisConnectionDetailsConfiguration; @@ -20,8 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @Import(RedisConnectionDetailsConfiguration.class) @TestPropertySource(locations = {"classpath:connectiondetails/application-redis.properties"}) @ActiveProfiles("redis") -public class RedisCacheConnnectionDetailsIntegrationTest { - private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsIntegrationTest.class); +public class RedisCacheConnnectionDetailsLiveTest { + private static final Logger logger = LoggerFactory.getLogger(RedisCacheConnnectionDetailsLiveTest.class); @Autowired RedisTemplate redisTemplate; From e144d0599bb78ccf86b5e0c62fd8e571180d764b Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Wed, 6 Dec 2023 21:47:52 +0530 Subject: [PATCH 779/831] Java 28508 Fix formatting of POMs Modules A to C (#15359) --- apache-kafka-2/pom.xml | 2 +- aws-modules/aws-dynamodb/pom.xml | 4 +- aws-modules/pom.xml | 13 ++--- core-java-modules/core-java-20/pom.xml | 54 +++++++++---------- .../pom.xml | 2 +- .../core-java-collections-maps-6/pom.xml | 7 +-- .../core-java-collections-maps-7/pom.xml | 14 ++--- .../core-java-reflection-3/pom.xml | 4 +- .../core-java-string-operations-2/pom.xml | 8 +-- 9 files changed, 56 insertions(+), 52 deletions(-) diff --git a/apache-kafka-2/pom.xml b/apache-kafka-2/pom.xml index cd21a60e14..dedd5df602 100644 --- a/apache-kafka-2/pom.xml +++ b/apache-kafka-2/pom.xml @@ -55,7 +55,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.databind.version} + ${jackson.databind.version} diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml index adce036733..155d48c240 100644 --- a/aws-modules/aws-dynamodb/pom.xml +++ b/aws-modules/aws-dynamodb/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 aws-dynamodb 0.1.0-SNAPSHOT diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 06cea2f260..ce27a4f2e0 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -5,6 +5,13 @@ 4.0.0 aws-modules aws-modules + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + com.amazonaws @@ -15,12 +22,6 @@ pom - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - aws-app-sync aws-dynamodb diff --git a/core-java-modules/core-java-20/pom.xml b/core-java-modules/core-java-20/pom.xml index ad0a956b80..68c6ca4c93 100644 --- a/core-java-modules/core-java-20/pom.xml +++ b/core-java-modules/core-java-20/pom.xml @@ -3,19 +3,34 @@ 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 + core-java-20 + com.baeldung.core-java-modules core-java-modules 0.0.1-SNAPSHOT - core-java-20 - - - 20 - 20 - UTF-8 - + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + provided + + + org.assertj + assertj-core + 3.24.2 + test + + + org.mockito + mockito-junit-jupiter + 5.2.0 + test + + @@ -41,25 +56,10 @@ - - - jakarta.servlet - jakarta.servlet-api - 6.0.0 - provided - - - org.assertj - assertj-core - 3.24.2 - test - - - org.mockito - mockito-junit-jupiter - 5.2.0 - test - - + + 20 + 20 + UTF-8 + \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml index 52787cc0c9..265577f75e 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml +++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml @@ -57,7 +57,7 @@ - + 11 diff --git a/core-java-modules/core-java-collections-maps-6/pom.xml b/core-java-modules/core-java-collections-maps-6/pom.xml index eec59616e7..a0cdc07644 100644 --- a/core-java-modules/core-java-collections-maps-6/pom.xml +++ b/core-java-modules/core-java-collections-maps-6/pom.xml @@ -13,9 +13,6 @@ 0.0.1-SNAPSHOT - - 5.2.5.RELEASE - com.fasterxml.jackson.core @@ -51,4 +48,8 @@ + + 5.2.5.RELEASE + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-7/pom.xml b/core-java-modules/core-java-collections-maps-7/pom.xml index 2d08c0a438..bd355bea1e 100644 --- a/core-java-modules/core-java-collections-maps-7/pom.xml +++ b/core-java-modules/core-java-collections-maps-7/pom.xml @@ -1,15 +1,11 @@ + 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 core-java-collections-maps-7 core-java-collections-maps-7 jar - - 2.10.1 - 1.5 - core-java-modules @@ -63,4 +59,10 @@ + + + 2.10.1 + 1.5 + + diff --git a/core-java-modules/core-java-reflection-3/pom.xml b/core-java-modules/core-java-reflection-3/pom.xml index fa5fe897e0..e60652f1f2 100644 --- a/core-java-modules/core-java-reflection-3/pom.xml +++ b/core-java-modules/core-java-reflection-3/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 core-java-reflection-3 core-java-reflection-3 diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml index 27071e5427..76f21aa726 100644 --- a/core-java-modules/core-java-string-operations-2/pom.xml +++ b/core-java-modules/core-java-string-operations-2/pom.xml @@ -44,10 +44,10 @@ commons-codec ${commons-codec.version} - - org.springframework - spring-core - ${spring-core.version} + + org.springframework + spring-core + ${spring-core.version} From b5f48cee006ce961d15a9d72fdc06603e5b21c32 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Wed, 6 Dec 2023 08:41:19 -0800 Subject: [PATCH 780/831] JAVA-28505 Fix references to parent (#15345) --- .../custom-validations-opeanpi-codegen/pom.xml | 3 +-- spring-swagger-codegen/pom.xml | 1 + .../spring-swagger-codegen-api-client/pom.xml | 1 - spring-swagger-codegen/spring-swagger-codegen-app/pom.xml | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index b1c2bf61f1..136f5b8907 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -11,9 +11,8 @@ com.baeldung - parent-boot-2 + spring-swagger-codegen 0.0.1-SNAPSHOT - ../../parent-boot-2 diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index d4fff7eb63..ce28f28c22 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -16,6 +16,7 @@ + custom-validations-opeanpi-codegen spring-swagger-codegen-api-client spring-openapi-generator-api-client spring-swagger-codegen-app diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index af12f9cef0..5ad15f6851 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -33,7 +33,6 @@ com.baeldung spring-swagger-codegen 0.0.1-SNAPSHOT - ../../spring-swagger-codegen diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index d3f57474ef..a7969df518 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -10,7 +10,6 @@ com.baeldung spring-swagger-codegen 0.0.1-SNAPSHOT - ../../spring-swagger-codegen From cab75d510a258d26868fa95867f6afdec553769e Mon Sep 17 00:00:00 2001 From: MohamedHelmyKassab <137485958+MohamedHelmyKassab@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:04:02 +0200 Subject: [PATCH 781/831] This commit is related to BAEL-7104 (#15368) This commit aims to add a test class "SkipInputStreamUnitTest" that provide a test method that utilizes the skip() method. --- .../SkipInputStreamUnitTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java diff --git a/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java new file mode 100644 index 0000000000..a41e5642fe --- /dev/null +++ b/core-java-modules/core-java-streams/src/test/java/com/baeldung/skipinputstream/SkipInputStreamUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.skipinputstream; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertArrayEquals; + +public class SkipInputStreamUnitTest { + @Test + public void givenInputStreamWithBytes_whenSkipBytes_thenRemainingBytes() throws IOException { + byte[] inputData = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + InputStream inputStream = new ByteArrayInputStream(inputData); + + long bytesToSkip = 3; + long skippedBytes = inputStream.skip(bytesToSkip); + + assertArrayEquals(new byte[]{4, 5, 6, 7, 8, 9, 10}, readRemainingBytes(inputStream)); + + assert skippedBytes == bytesToSkip : "Incorrect number of bytes skipped"; + } + + private byte[] readRemainingBytes(InputStream inputStream) throws IOException { + byte[] buffer = new byte[inputStream.available()]; + int bytesRead = inputStream.read(buffer); + if (bytesRead == -1) { + throw new IOException("End of stream reached"); + } + return buffer; + } +} From 4e3e693f7109722c9db87d0367e69df527eb77bd Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:08:38 +0200 Subject: [PATCH 782/831] This commit is related to BAEL-6920 (#15371) This commit aims to add a class "StringMaxLengthMain" showing the string max length. --- .../stringmaxlength/StringMaxLengthMain.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java diff --git a/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java new file mode 100644 index 0000000000..42d0c05582 --- /dev/null +++ b/core-java-modules/core-java-string-operations-7/src/main/java/com/baeldung/stringmaxlength/StringMaxLengthMain.java @@ -0,0 +1,35 @@ +package com.baeldung.stringmaxlength; + +public class StringMaxLengthMain { + + public static void main(String[] args) { + displayRuntimeMaxStringLength(); + displayMaxStringLength(); + simulateStringOverflow(); + } + + public static void simulateStringOverflow() { + try { + int maxLength = Integer.MAX_VALUE; + char[] charArray = new char[maxLength]; + for (int i = 0; i < maxLength; i++) { + charArray[i] = 'a'; + } + String longString = new String(charArray); + System.out.println("Successfully created a string of length: " + longString.length()); + } catch (OutOfMemoryError e) { + System.err.println("Overflow error: Attempting to create a string longer than Integer.MAX_VALUE"); + e.printStackTrace(); + } + } + + public static void displayRuntimeMaxStringLength() { + long maxMemory = Runtime.getRuntime().maxMemory(); + System.out.println("Maximum String length based on available memory: " + (maxMemory)); + } + + public static void displayMaxStringLength() { + int maxStringLength = Integer.MAX_VALUE; + System.out.println("Maximum String length based on Integer.MAX_VALUE: " + maxStringLength); + } +} \ No newline at end of file From 97aaeed2c0a9dcf4b72664db6957c3ba8005d324 Mon Sep 17 00:00:00 2001 From: Geoffrey De Smet Date: Thu, 7 Dec 2023 08:21:13 +0100 Subject: [PATCH 783/831] Fix Timefold Solver readme + remove unpublished article --- timefold-solver/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/timefold-solver/README.md b/timefold-solver/README.md index b7a2dbe14b..1abc4d4ca0 100644 --- a/timefold-solver/README.md +++ b/timefold-solver/README.md @@ -1,7 +1,6 @@ -## OptaPlanner +## Timefold Solver -This module contains articles about OptaPlanner. +This module contains articles about (Timefold Solver)[https://timefold.ai]. ### Relevant articles -- [A Guide to OptaPlanner](https://www.baeldung.com/opta-planner) From 232730dbbbbab342cf98191015e609f36fa8f76f Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:27:02 +0200 Subject: [PATCH 784/831] JAVA-27674 Upgrade apache-httpclient to v5 (#15329) --- apache-httpclient/pom.xml | 12 +++--------- .../baeldung/httpclient/HttpAsyncClientLiveTest.java | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/apache-httpclient/pom.xml b/apache-httpclient/pom.xml index 3b178d4df8..f671c93cfc 100644 --- a/apache-httpclient/pom.xml +++ b/apache-httpclient/pom.xml @@ -63,11 +63,6 @@ ${wiremock.version} test - - org.apache.httpcomponents - httpclient - ${httpclient.version} - @@ -84,10 +79,9 @@ 5.6.1 3.3.1 - 5.2 - 5.2 - 5.2 - 4.5.14 + 5.2.2 + 5.2.2 + 5.2.2 diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java index 50cf1b7a64..7b818f871a 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java @@ -25,6 +25,7 @@ import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBu import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; import org.apache.hc.client5.http.protocol.HttpClientContext; import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.HttpResponse; import org.apache.hc.core5.http.nio.ssl.TlsStrategy; @@ -33,7 +34,6 @@ import org.apache.hc.core5.http.protocol.HttpContext; import org.apache.hc.core5.reactor.IOReactorConfig; import org.apache.hc.core5.ssl.SSLContexts; import org.apache.hc.core5.ssl.TrustStrategy; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.junit.jupiter.api.Test; @@ -120,7 +120,7 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { .build(); final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create() - .setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) .setSslContext(sslContext) .build(); From 19184bdf406461c21b3ba48873626f89b8dfc49f Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Thu, 7 Dec 2023 13:12:55 +0200 Subject: [PATCH 785/831] [JAVA-27761] Upgraded spring-reactive-2 to spring boot 3 (#15293) --- .../spring-reactive-2/pom.xml | 18 ++++-- ...n.java => Spring6ReactiveApplication.java} | 4 +- .../consumer/ConsumerSSEApplication.java | 7 +- .../reactive/urlmatch/FormHandler.java | 2 +- .../com/baeldung/reactive/util/CpuUtils.java | 2 +- .../staticcontent/StaticContentConfig.java | 2 +- .../FunctionalValidationsApplication.java | 9 +-- .../model/AnnotatedRequestEntity.java | 4 +- .../backpressure/BackpressureUnitTest.java | 64 +++++++++---------- ...ernsUsingHandlerMethodIntegrationTest.java | 4 +- 10 files changed, 60 insertions(+), 56 deletions(-) rename spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/{Spring5ReactiveApplication.java => Spring6ReactiveApplication.java} (77%) diff --git a/spring-reactive-modules/spring-reactive-2/pom.xml b/spring-reactive-modules/spring-reactive-2/pom.xml index a5552bfe51..fac93154c8 100644 --- a/spring-reactive-modules/spring-reactive-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-2/pom.xml @@ -10,9 +10,10 @@ spring sample project about new features - com.baeldung.spring.reactive - spring-reactive-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -45,8 +46,8 @@ test - com.github.tomakehurst - wiremock-jre8 + org.wiremock + wiremock ${wiremock.version} test @@ -64,6 +65,11 @@ org.springframework.boot spring-boot-starter-tomcat + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + @@ -116,7 +122,7 @@ 1.0.1.RELEASE - 2.24.0 + 3.3.1 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java similarity index 77% rename from spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java rename to spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java index ef862dd957..f716af4a0e 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/Spring6ReactiveApplication.java @@ -5,10 +5,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; @SpringBootApplication(exclude = { RedisAutoConfiguration.class }) -public class Spring5ReactiveApplication{ +public class Spring6ReactiveApplication { public static void main(String[] args) { - SpringApplication.run(Spring5ReactiveApplication.class, args); + SpringApplication.run(Spring6ReactiveApplication.class, args); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java index d8edaf7fd5..bec7dd2e0c 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java @@ -22,9 +22,10 @@ public class ConsumerSSEApplication { @Bean public SecurityWebFilterChain sseConsumerSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); + http.authorizeExchange(auth -> auth + .anyExchange().permitAll() + ) + .csrf(ServerHttpSecurity.CsrfSpec::disable); return http.build(); } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java index 7b1fb06459..1652e2f25d 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java @@ -34,7 +34,7 @@ public class FormHandler { private AtomicLong extractData(List dataBuffers) { AtomicLong atomicLong = new AtomicLong(0); - dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() + dataBuffers.forEach(d -> atomicLong.addAndGet(d.toByteBuffer() .array().length)); return atomicLong; } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java index 8d16434920..20cc162cde 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/reactive/util/CpuUtils.java @@ -9,7 +9,7 @@ public class CpuUtils { private static OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); static Double getUsage() { - return (operatingSystemMXBean.getSystemCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100; + return (operatingSystemMXBean.getCpuLoad() / operatingSystemMXBean.getAvailableProcessors()) * 100; } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java index 1fbb9958e7..456eec8f84 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java @@ -23,7 +23,7 @@ public class StaticContentConfig { GET("/"), request -> ok() .contentType(MediaType.TEXT_HTML) - .syncBody(html) + .bodyValue(html) ); } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java index 4cbb65dc60..bcbd4d55d7 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java @@ -15,10 +15,11 @@ public class FunctionalValidationsApplication { @Bean public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) { - http.authorizeExchange() - .anyExchange() - .permitAll(); - http.csrf().disable(); + http.authorizeExchange(auth -> auth + .anyExchange().permitAll() + ) + .csrf(ServerHttpSecurity.CsrfSpec::disable); + return http.build(); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java index 992f07481c..6ca6c369c1 100644 --- a/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java +++ b/spring-reactive-modules/spring-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java @@ -1,7 +1,7 @@ package com.baeldung.validations.functional.model; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java index a12d762fe5..c087e10b3f 100644 --- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java +++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java @@ -24,49 +24,45 @@ public class BackpressureUnitTest { ); StepVerifier.create(limit) - .expectSubscription() - .thenRequest(15) - .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - .expectNext(11, 12, 13, 14, 15) - .thenRequest(10) - .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25) - .verifyComplete(); + .expectSubscription() + .thenRequest(15) + .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + .expectNext(11, 12, 13, 14, 15) + .thenRequest(10) + .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25) + .verifyComplete(); } @Test public void whenRequestingChunks10_thenMessagesAreReceived() { Flux request = Flux.range(1, 50); - request.subscribe( - integer -> LOGGER.debug(String.valueOf(integer)), - err -> err.printStackTrace(), - () -> LOGGER.debug("All 50 items have been successfully processed!!!"), - subscription -> { - for (int i = 0; i < 5; i++) { - LOGGER.debug("Requesting the next 10 elements!!!"); - subscription.request(10); - } - } - ); + request.subscribe(integer -> LOGGER.debug(String.valueOf(integer)), err -> err.printStackTrace(), () -> LOGGER.debug("All 50 items have been successfully processed!!!"), subscription -> { + for (int i = 0; i < 5; i++) { + LOGGER.debug("Requesting the next 10 elements!!!"); + subscription.request(10); + } + }); StepVerifier.create(request) - .expectSubscription() - .thenRequest(10) - .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - .thenRequest(10) - .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20) - .thenRequest(10) - .expectNext(21, 22, 23, 24, 25, 26, 27 , 28, 29 ,30) - .thenRequest(10) - .expectNext(31, 32, 33, 34, 35, 36, 37 , 38, 39 ,40) - .thenRequest(10) - .expectNext(41, 42, 43, 44, 45, 46, 47 , 48, 49 ,50) - .verifyComplete(); + .expectSubscription() + .thenRequest(10) + .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + .thenRequest(10) + .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20) + .thenRequest(10) + .expectNext(21, 22, 23, 24, 25, 26, 27, 28, 29, 30) + .thenRequest(10) + .expectNext(31, 32, 33, 34, 35, 36, 37, 38, 39, 40) + .thenRequest(10) + .expectNext(41, 42, 43, 44, 45, 46, 47, 48, 49, 50) + .verifyComplete(); } @Test public void whenCancel_thenSubscriptionFinished() { - Flux cancel = Flux.range(1, 10).log(); + Flux cancel = Flux.range(1, 10) + .log(); cancel.subscribe(new BaseSubscriber() { @Override @@ -78,9 +74,9 @@ public class BackpressureUnitTest { }); StepVerifier.create(cancel) - .expectNext(1, 2, 3) - .thenCancel() - .verify(); + .expectNext(1, 2, 3) + .thenCancel() + .verify(); } } diff --git a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java index 0b4607b54a..4069888dcd 100644 --- a/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-2/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -8,11 +8,11 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; -import com.baeldung.reactive.Spring5ReactiveApplication; +import com.baeldung.reactive.Spring6ReactiveApplication; import com.baeldung.reactive.controller.PathPatternController; @RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5ReactiveApplication.class) +@SpringBootTest(classes = Spring6ReactiveApplication.class) @WithMockUser public class PathPatternsUsingHandlerMethodIntegrationTest { From 183101cd4fb51a0a241bb8202169a35324709bb3 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:51:10 +0800 Subject: [PATCH 786/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index dead88f025..cb272b0029 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -4,3 +4,4 @@ - [Convert int to Long in Java](https://www.baeldung.com/java-convert-int-long) - [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) - [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal) +- [Convert Positive Integer to Negative and Vice Versa in Java](https://www.baeldung.com/java-negating-integer) From d8be8b3bb1c2fbc7bd5b32eb53bf390e6e43a55c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:54:34 +0800 Subject: [PATCH 787/831] Update README.md [skip ci] --- core-java-modules/core-java-arrays-convert/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md index 2e34829525..118d8e00ed 100644 --- a/core-java-modules/core-java-arrays-convert/README.md +++ b/core-java-modules/core-java-arrays-convert/README.md @@ -11,3 +11,4 @@ This module contains articles about arrays conversion in Java - [Converting an int[] to HashSet in Java](https://www.baeldung.com/java-converting-int-array-to-hashset) - [Convert an ArrayList of String to a String Array in Java](https://www.baeldung.com/java-convert-string-arraylist-array) - [Convert Char Array to Int Array in Java](https://www.baeldung.com/java-convert-char-int-array) +- [How to Convert Byte Array to Char Array](https://www.baeldung.com/java-convert-byte-array-char) From 300b524fdecdcef76aeab7d66a2f94cbb7ed5565 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:58:50 +0800 Subject: [PATCH 788/831] Create README.md [skip ci] --- core-java-modules/core-java-numbers-7/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core-java-modules/core-java-numbers-7/README.md diff --git a/core-java-modules/core-java-numbers-7/README.md b/core-java-modules/core-java-numbers-7/README.md new file mode 100644 index 0000000000..42a43fd1fd --- /dev/null +++ b/core-java-modules/core-java-numbers-7/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Check if a double Is an Integer in Java](https://www.baeldung.com/java-check-double-integer) From 983c7190b954358d160e01c8024314a176bd5db8 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:03:42 +0800 Subject: [PATCH 789/831] Update README.md [skip ci] --- json-modules/gson-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/gson-2/README.md b/json-modules/gson-2/README.md index 3deb61f25d..912f8b0a20 100644 --- a/json-modules/gson-2/README.md +++ b/json-modules/gson-2/README.md @@ -5,4 +5,4 @@ This module contains articles about Gson ### Relevant Articles: - [Solving Gson Parsing Errors](https://www.baeldung.com/gson-parsing-errors) - [Difference between Gson @Expose and @SerializedName](https://www.baeldung.com/gson-expose-vs-serializedname) - +- [Resolving Gson’s “Multiple JSON Fields” Exception](https://www.baeldung.com/java-gson-multiple-json-fields-exception) From 9c8c7ff561f2f0a19b1f06687e7c30c5357ea392 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:09:39 +0800 Subject: [PATCH 790/831] Update README.md [skip ci] --- static-analysis/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/static-analysis/README.md b/static-analysis/README.md index 235b79853b..ea0d797407 100644 --- a/static-analysis/README.md +++ b/static-analysis/README.md @@ -6,3 +6,4 @@ This module contains articles about static program analysis - [Introduction to PMD](https://www.baeldung.com/pmd) - [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](https://www.baeldung.com/java-static-analysis-tools) +- [Catch Common Mistakes with Error Prone Library in Java](https://www.baeldung.com/java-error-prone-library) From fa10ea0e21110d80696bbff5333d29cc13e9333d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:12:10 +0800 Subject: [PATCH 791/831] Update README.md [skip ci] --- xml/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml/README.md b/xml/README.md index 16942c6836..596ddc14aa 100644 --- a/xml/README.md +++ b/xml/README.md @@ -13,3 +13,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax) - [Parsing an XML File Using SAX Parser](https://www.baeldung.com/java-sax-parser) - [Remove HTML Tags Using Java](https://www.baeldung.com/java-remove-html-tags) +- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv) From 6b41d74e5fa5e3cfd299dafb15b0e87f13a0a2ba Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:15:31 +0800 Subject: [PATCH 792/831] Create README.md [skip ci] --- persistence-modules/java-harperdb/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 persistence-modules/java-harperdb/README.md diff --git a/persistence-modules/java-harperdb/README.md b/persistence-modules/java-harperdb/README.md new file mode 100644 index 0000000000..99a91e00ed --- /dev/null +++ b/persistence-modules/java-harperdb/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Working With HarperDB and Java](https://www.baeldung.com/java-harperdb) From 5600e16d489cdf80650c648ca562b174cdf10b4b Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:20:24 +0800 Subject: [PATCH 793/831] Update README.md [skip ci] --- json-modules/json/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/json-modules/json/README.md b/json-modules/json/README.md index d643914fc7..d6e1b400f5 100644 --- a/json-modules/json/README.md +++ b/json-modules/json/README.md @@ -12,4 +12,5 @@ This module contains articles about JSON. - [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration) - [Escape JSON String in Java](https://www.baeldung.com/java-json-escaping) - [Reducing JSON Data Size](https://www.baeldung.com/json-reduce-data-size) +- [How to Convert JsonNode to ObjectNode](https://www.baeldung.com/java-jackson-jsonnode-objectnode) - More Articles: [[next -->]](../json-2) From 3adfcb215cd6568caf86d4e007dd704dafad07f5 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:22:56 +0800 Subject: [PATCH 794/831] Update README.md [skip ci] --- core-java-modules/core-java-lang-operators-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md index e8b792e634..4b93f8d192 100644 --- a/core-java-modules/core-java-lang-operators-2/README.md +++ b/core-java-modules/core-java-lang-operators-2/README.md @@ -10,3 +10,4 @@ This module contains articles about Java operators - [Check if at Least Two Out of Three Booleans Are True in Java](https://www.baeldung.com/java-check-two-of-three-booleans) - [Alternatives for instanceof Operator in Java](https://www.baeldung.com/java-instanceof-alternatives) - [What Does “––>” Mean in Java?](https://www.baeldung.com/java-minus-minus-greaterthan) +- [All the Ways Java Uses the Colon Character](https://www.baeldung.com/java-colon) From d63b2b5a2ad4b21de2ac2d407cb128526a28642a Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:24:56 +0800 Subject: [PATCH 795/831] Update README.md [skip ci] --- core-java-modules/core-java-numbers-conversions/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-numbers-conversions/README.md b/core-java-modules/core-java-numbers-conversions/README.md index cb272b0029..b5f02a9d47 100644 --- a/core-java-modules/core-java-numbers-conversions/README.md +++ b/core-java-modules/core-java-numbers-conversions/README.md @@ -5,3 +5,4 @@ - [How To Convert Double To Float In Java](https://www.baeldung.com/java-convert-double-float) - [Converting from float to BigDecimal in Java](https://www.baeldung.com/java-convert-float-bigdecimal) - [Convert Positive Integer to Negative and Vice Versa in Java](https://www.baeldung.com/java-negating-integer) +- [Rounding Up a Number to Nearest Multiple of 5 in Java](https://www.baeldung.com/java-round-nearest-multiple-five) From bf1aaf197f9733cfa0e5ccd0c0ada50a8d8b52b4 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 8 Dec 2023 09:51:11 +0200 Subject: [PATCH 796/831] [JAVA-28504] Clean up --- spring-websockets/pom.xml | 6 +++++- static-analysis/error-prone-project/pom.xml | 11 ++++------- static-analysis/my-bugchecker-plugin/pom.xml | 11 +++-------- static-analysis/pmd/pom.xml | 10 ++-------- tablesaw/pom.xml | 5 ----- testing-modules/cucumber/pom.xml | 2 -- testing-modules/gatling-java/pom.xml | 3 --- testing-modules/gatling/pom.xml | 3 --- testing-modules/jqwik/pom.xml | 6 +++++- testing-modules/junit-5-advanced/pom.xml | 3 ++- testing-modules/junit-5-basics-2/pom.xml | 7 ------- testing-modules/junit-5/pom.xml | 1 - testing-modules/load-testing-comparison/pom.xml | 3 --- testing-modules/mockito-2/pom.xml | 3 --- vavr-modules/java-vavr-stream/pom.xml | 6 +----- vavr-modules/pom.xml | 4 ++++ vavr-modules/vavr-2/pom.xml | 4 ---- vertx-modules/pom.xml | 4 ++++ vertx-modules/vertx-and-rxjava/pom.xml | 4 ---- vertx-modules/vertx/pom.xml | 1 - web-modules/apache-tapestry/pom.xml | 8 -------- web-modules/blade/pom.xml | 1 - web-modules/jakarta-ee/pom.xml | 9 ++------- 23 files changed, 32 insertions(+), 83 deletions(-) diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml index a28ef8749a..6ca84c4946 100644 --- a/spring-websockets/pom.xml +++ b/spring-websockets/pom.xml @@ -26,7 +26,7 @@ com.github.javafaker javafaker - 1.0.2 + ${javafaker.version} com.google.code.gson @@ -44,4 +44,8 @@ + + 1.0.2 + + \ No newline at end of file diff --git a/static-analysis/error-prone-project/pom.xml b/static-analysis/error-prone-project/pom.xml index 59f7bb7270..2d5706d0d2 100644 --- a/static-analysis/error-prone-project/pom.xml +++ b/static-analysis/error-prone-project/pom.xml @@ -3,14 +3,14 @@ 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 + error-prone-project + com.baeldung static-analysis 1.0-SNAPSHOT - error-prone-project - @@ -19,7 +19,6 @@ ${maven-compiler-plugin.version} 17 - UTF-8 true -XDcompilePolicy=simple @@ -44,7 +43,7 @@ com.baeldung my-bugchecker-plugin - 1.0-SNAPSHOT + ${my-bugchecker-plugin.version} @@ -53,9 +52,7 @@ - 17 - 17 - UTF-8 + 1.0-SNAPSHOT diff --git a/static-analysis/my-bugchecker-plugin/pom.xml b/static-analysis/my-bugchecker-plugin/pom.xml index cbe16b0a14..eb11f07b4e 100644 --- a/static-analysis/my-bugchecker-plugin/pom.xml +++ b/static-analysis/my-bugchecker-plugin/pom.xml @@ -3,13 +3,14 @@ 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 + my-bugchecker-plugin + jar + com.baeldung static-analysis 1.0-SNAPSHOT - jar - my-bugchecker-plugin @@ -47,10 +48,4 @@ - - 17 - 17 - UTF-8 - - diff --git a/static-analysis/pmd/pom.xml b/static-analysis/pmd/pom.xml index 31914fe9f0..372c122776 100644 --- a/static-analysis/pmd/pom.xml +++ b/static-analysis/pmd/pom.xml @@ -3,18 +3,12 @@ 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 + pmd + com.baeldung static-analysis 1.0-SNAPSHOT - pmd - - - 17 - 17 - UTF-8 - - diff --git a/tablesaw/pom.xml b/tablesaw/pom.xml index f38e4cb8b4..c45931a9e2 100644 --- a/tablesaw/pom.xml +++ b/tablesaw/pom.xml @@ -25,11 +25,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 - - 17 - 17 - diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml index c1d99bb492..088a75a941 100644 --- a/testing-modules/cucumber/pom.xml +++ b/testing-modules/cucumber/pom.xml @@ -121,8 +121,6 @@ - 14 - 14 6.10.3 5.4.0 3.141.59 diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml index abe033f298..54dee1fd88 100644 --- a/testing-modules/gatling-java/pom.xml +++ b/testing-modules/gatling-java/pom.xml @@ -72,9 +72,6 @@ - 1.8 - 1.8 - UTF-8 3.9.5 4.3.0 1.0.2 diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml index 82ce988bac..e5b1db2bfb 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-modules/gatling/pom.xml @@ -105,9 +105,6 @@ - 1.8 - 1.8 - UTF-8 2.12.6 3.3.1 4.3.0 diff --git a/testing-modules/jqwik/pom.xml b/testing-modules/jqwik/pom.xml index 6ef9b61a6a..85c4ba571a 100644 --- a/testing-modules/jqwik/pom.xml +++ b/testing-modules/jqwik/pom.xml @@ -17,7 +17,7 @@ net.jqwik jqwik - 1.7.4 + ${jqwik.version} test @@ -53,5 +53,9 @@ + + 1.7.4 + + diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index 411f189638..fc0349ff8e 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -18,7 +18,7 @@ com.github.stefanbirkner system-lambda - 1.2.1 + ${system-lambda.version} test @@ -79,6 +79,7 @@ + 1.2.1 1.49 3.24.2 1.10.1 diff --git a/testing-modules/junit-5-basics-2/pom.xml b/testing-modules/junit-5-basics-2/pom.xml index b430161380..f03b74f47a 100644 --- a/testing-modules/junit-5-basics-2/pom.xml +++ b/testing-modules/junit-5-basics-2/pom.xml @@ -36,18 +36,11 @@ org.apache.maven.plugins maven-compiler-plugin - - 11 - 11 - - 11 - 11 - UTF-8 1.5.0 5.10.0 5.5.0 diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 8afaa085b1..cdddf90855 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -107,7 +107,6 @@ org.codehaus.mojo exec-maven-plugin - ${exec-maven-plugin.version} diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml index d5a389d311..af42523ca9 100644 --- a/testing-modules/load-testing-comparison/pom.xml +++ b/testing-modules/load-testing-comparison/pom.xml @@ -66,9 +66,6 @@ - 1.8 - 1.8 - UTF-8 2.12.12 3.4.0 4.4.0 diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index 0e0f19b6b3..100c9d7015 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -21,9 +21,6 @@ - 8 - 8 - UTF-8 4.8.1 diff --git a/vavr-modules/java-vavr-stream/pom.xml b/vavr-modules/java-vavr-stream/pom.xml index cda9d1f734..e369fa7cf3 100644 --- a/vavr-modules/java-vavr-stream/pom.xml +++ b/vavr-modules/java-vavr-stream/pom.xml @@ -19,12 +19,8 @@ io.vavr vavr - ${io.vavr.version} + ${vavr.version} - - 0.9.2 - - \ No newline at end of file diff --git a/vavr-modules/pom.xml b/vavr-modules/pom.xml index 416c689511..e9a3b121aa 100644 --- a/vavr-modules/pom.xml +++ b/vavr-modules/pom.xml @@ -30,4 +30,8 @@ + + 0.9.2 + + \ No newline at end of file diff --git a/vavr-modules/vavr-2/pom.xml b/vavr-modules/vavr-2/pom.xml index 0063daa518..54f3cb4d71 100644 --- a/vavr-modules/vavr-2/pom.xml +++ b/vavr-modules/vavr-2/pom.xml @@ -21,8 +21,4 @@ - - 0.9.1 - - \ No newline at end of file diff --git a/vertx-modules/pom.xml b/vertx-modules/pom.xml index 7d9614ad61..00f0bc46f5 100644 --- a/vertx-modules/pom.xml +++ b/vertx-modules/pom.xml @@ -30,4 +30,8 @@ + + 3.9.15 + + \ No newline at end of file diff --git a/vertx-modules/vertx-and-rxjava/pom.xml b/vertx-modules/vertx-and-rxjava/pom.xml index 16eaf8ebaa..b68117ddeb 100644 --- a/vertx-modules/vertx-and-rxjava/pom.xml +++ b/vertx-modules/vertx-and-rxjava/pom.xml @@ -40,8 +40,4 @@ - - 3.9.15 - - \ No newline at end of file diff --git a/vertx-modules/vertx/pom.xml b/vertx-modules/vertx/pom.xml index 75df2fae69..d34deca9d8 100644 --- a/vertx-modules/vertx/pom.xml +++ b/vertx-modules/vertx/pom.xml @@ -65,7 +65,6 @@ - 3.9.15 3.2.1 diff --git a/web-modules/apache-tapestry/pom.xml b/web-modules/apache-tapestry/pom.xml index 562cdff00c..bfc7c22415 100644 --- a/web-modules/apache-tapestry/pom.xml +++ b/web-modules/apache-tapestry/pom.xml @@ -78,17 +78,13 @@ org.apache.maven.plugins maven-compiler-plugin - ${compiler.plugin.version} - ${source.version} - ${target.version} true org.apache.maven.plugins maven-surefire-plugin - ${compiler.surefire.version} Qa @@ -118,7 +114,6 @@ org.apache.maven.plugins maven-war-plugin - 3.3.1 @@ -140,9 +135,6 @@ 6.1.16 3.0.0-M5 - 3.8.1 - 11 - 11 5.8.2 2.5 6.8.21 diff --git a/web-modules/blade/pom.xml b/web-modules/blade/pom.xml index 2748c05663..fb0ca13dbe 100644 --- a/web-modules/blade/pom.xml +++ b/web-modules/blade/pom.xml @@ -62,7 +62,6 @@ org.apache.maven.plugins maven-failsafe-plugin - ${maven-failsafe-plugin.version} true diff --git a/web-modules/jakarta-ee/pom.xml b/web-modules/jakarta-ee/pom.xml index 066bc14766..d90e848323 100644 --- a/web-modules/jakarta-ee/pom.xml +++ b/web-modules/jakarta-ee/pom.xml @@ -2,7 +2,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung jakarta-ee 1.0-SNAPSHOT jakarta-ee @@ -51,7 +50,7 @@ org.glassfish.maven.plugin maven-glassfish-plugin - 2.1 + ${maven-glassfish-plugin.version} ${local.glassfish.home} admin @@ -76,11 +75,6 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 - - 11 - 11 - org.apache.maven.plugins @@ -104,6 +98,7 @@ ${local.glassfish.home}\\domains\\${local.glassfish.domain}\\config\\domain-passwords + 2.1 \ No newline at end of file From 6f9a2c2dfede5a9ca8746f04af2439a9da6ee464 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 8 Dec 2023 00:05:04 -0800 Subject: [PATCH 797/831] JAVA-26279 Improve aws-modules build time (#15370) --- aws-modules/aws-dynamodb/pom.xml | 16 ---------------- aws-modules/aws-miscellaneous/pom.xml | 16 ---------------- aws-modules/aws-s3/pom.xml | 21 --------------------- 3 files changed, 53 deletions(-) diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml index 155d48c240..199b9a187e 100644 --- a/aws-modules/aws-dynamodb/pom.xml +++ b/aws-modules/aws-dynamodb/pom.xml @@ -40,22 +40,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - org.apache.maven.plugins maven-dependency-plugin diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml index b6326b6eb1..f04e84e14f 100644 --- a/aws-modules/aws-miscellaneous/pom.xml +++ b/aws-modules/aws-miscellaneous/pom.xml @@ -34,22 +34,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - org.apache.maven.plugins maven-dependency-plugin diff --git a/aws-modules/aws-s3/pom.xml b/aws-modules/aws-s3/pom.xml index e2bc04964a..9ba436b43f 100644 --- a/aws-modules/aws-s3/pom.xml +++ b/aws-modules/aws-s3/pom.xml @@ -39,27 +39,6 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - false - - - - package - - shade - - - - - - - 2.20.52 1.10.L001 From 18643bc0a02f50b57fcf6fcfeb53ff61e3484fd1 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Fri, 8 Dec 2023 16:17:08 +0530 Subject: [PATCH 798/831] JAVA-26717:Changes made for Upgrade snakeyaml to latest version (#15284) --- libraries-data-io/pom.xml | 2 +- .../YAMLToJavaDeserialisationUnitTest.java | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml index c8d895b4e5..9fc2814312 100644 --- a/libraries-data-io/pom.xml +++ b/libraries-data-io/pom.xml @@ -98,7 +98,7 @@ - 1.21 + 2.2 4.0.1 1.7.0 5.8 diff --git a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java index 6f32f143a9..4c92bf41e1 100644 --- a/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java +++ b/libraries-data-io/src/test/java/com/baeldung/libraries/snakeyaml/YAMLToJavaDeserialisationUnitTest.java @@ -1,15 +1,19 @@ package com.baeldung.libraries.snakeyaml; -import org.junit.Test; -import org.yaml.snakeyaml.TypeDescription; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.util.Date; import java.util.Map; -import static org.junit.Assert.*; +import org.junit.Test; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.TypeDescription; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.inspector.TagInspector; public class YAMLToJavaDeserialisationUnitTest { @@ -27,7 +31,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObject() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class,new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer.yaml"); @@ -39,7 +43,11 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithAssumedClass_thenLoadCorrectJavaObject() { - Yaml yaml = new Yaml(); + LoaderOptions loaderoptions = new LoaderOptions(); + TagInspector taginspector = tag -> tag.getClassName() + .equals(Customer.class.getName()); + loaderoptions.setTagInspector(taginspector); + Yaml yaml = new Yaml(new Constructor(Customer.class, loaderoptions)); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer_with_type.yaml"); @@ -61,7 +69,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObjectWithNestedObjects() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer_with_contact_details_and_address.yaml"); @@ -91,7 +99,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadYAMLDocumentWithTypeDescription_thenLoadCorrectJavaObjectWithCorrectGenericType() { - Constructor constructor = new Constructor(Customer.class); + Constructor constructor = new Constructor(Customer.class, new LoaderOptions()); TypeDescription customTypeDescription = new TypeDescription(Customer.class); customTypeDescription.addPropertyParameters("contactDetails", Contact.class); constructor.addTypeDescription(customTypeDescription); @@ -116,7 +124,7 @@ public class YAMLToJavaDeserialisationUnitTest { @Test public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() { - Yaml yaml = new Yaml(new Constructor(Customer.class)); + Yaml yaml = new Yaml(new Constructor(Customer.class, new LoaderOptions())); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customers.yaml"); From e0b7b8c02011f478b5ec2131b82c7968d7c25cb9 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Fri, 8 Dec 2023 13:45:59 +0100 Subject: [PATCH 799/831] JAVA-26710 | Updating HikariCP library to the latest version - 5.1.0 (#15362) --- jhipster-modules/jhipster-microservice/car-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/dealer-app/pom.xml | 2 +- jhipster-modules/jhipster-microservice/gateway-app/pom.xml | 2 +- jhipster-modules/jhipster-monolithic/pom.xml | 2 +- libraries-data-db/pom.xml | 2 +- persistence-modules/core-java-persistence/pom.xml | 2 +- spring-4/pom.xml | 2 +- spring-5/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index f345688939..87c289cb46 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -23,7 +23,7 @@ 0.4.13 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 1.8 3.21.0-GA diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index 056bd60f33..f660463026 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -23,7 +23,7 @@ 0.4.13 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index b90f22f009..7c95704da7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -26,7 +26,7 @@ 1.3 1.2 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index fbcee8f1ff..bb82c819c4 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -892,7 +892,7 @@ 2.2.1 2.2.3 5.2.8.Final - 2.6.0 + 5.1.0 0.7.9 3.21.0-GA 1.0.0 diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml index 5f1ff489f4..6ee8daa2a5 100644 --- a/libraries-data-db/pom.xml +++ b/libraries-data-db/pom.xml @@ -300,7 +300,7 @@ 6.0.0-release 6.0.1 3.2.1 - 5.0.1 + 5.1.0 13.15.2 2.1.3.Final 2.2.3 diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml index 5d5c36ef01..20553da4e8 100644 --- a/persistence-modules/core-java-persistence/pom.xml +++ b/persistence-modules/core-java-persistence/pom.xml @@ -62,7 +62,7 @@ 2.9.0 - 5.0.1 + 5.1.0 0.9.5.5 3.0.4 6.0.6 diff --git a/spring-4/pom.xml b/spring-4/pom.xml index ad05123543..9a50319d13 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -121,7 +121,7 @@ 1.0.1 3.6 2.4.0 - 4.0.3 + 5.1.0 2.17.1 diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 1ac696e7bd..65f1b77520 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -143,7 +143,7 @@ 1.0 1.5.6 ${project.build.directory}/generated-snippets - 4.0.3 + 5.1.0 \ No newline at end of file From cc649a15860027ba89dffebf3f6d56820a4f2a0c Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Fri, 8 Dec 2023 23:27:33 +0530 Subject: [PATCH 800/831] JAVA-27515: Upgraded spring-session-jdbc to spring-boot-parent-3 (#15326) --- .../spring-session/spring-session-jdbc/pom.xml | 4 ++-- .../controller/SpringSessionJdbcController.java | 5 +++-- .../springsessionjdbc/SpringSessionJdbcIntegrationTest.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml index 3cc2b8d18e..24194f5426 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/pom.xml +++ b/spring-web-modules/spring-session/spring-session-jdbc/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../../parent-boot-2 + ../../../parent-boot-3 diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java index 509a5f292b..a173636ed8 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java +++ b/spring-web-modules/spring-session/spring-session-jdbc/src/main/java/com/baeldung/springsessionjdbc/controller/SpringSessionJdbcController.java @@ -7,11 +7,12 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.util.ArrayList; import java.util.List; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + @Controller public class SpringSessionJdbcController { diff --git a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java index 2dcc0b3af8..7133111e4c 100644 --- a/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java +++ b/spring-web-modules/spring-session/spring-session-jdbc/src/test/java/com/baeldung/springsessionjdbc/SpringSessionJdbcIntegrationTest.java @@ -9,7 +9,7 @@ import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; From 8ff0949464193a33fb64a339055f2e92b74e29bc Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:22:40 +0100 Subject: [PATCH 801/831] BAEL-6021: Handling NullPointerException in findFirst() When the First Element It Finds Is Null (#15341) --- ...FindFirstNullPointerExceptionUnitTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java diff --git a/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java new file mode 100644 index 0000000000..074aec29d6 --- /dev/null +++ b/core-java-modules/core-java-streams-5/src/test/java/com/baeldung/findfirstnullpointerexception/FindFirstNullPointerExceptionUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.findfirstnullpointerexception; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; + +import org.junit.Test; + +public class FindFirstNullPointerExceptionUnitTest { + + private final List inputs = Arrays.asList(null, "foo", "bar"); + + @Test(expected = NullPointerException.class) + public void givenStream_whenCallingFindFirst_thenThrowNullPointerException() { + Optional firstElement = inputs.stream() + .findFirst(); + } + + @Test + public void givenStream_whenUsingOfNullableBeforeFindFirst_thenCorrect() { + Optional firstElement = inputs.stream() + .map(Optional::ofNullable) + .findFirst() + .flatMap(Function.identity()); + + assertTrue(firstElement.isEmpty()); + } + + @Test + public void givenStream_whenUsingFilterBeforeFindFirst_thenCorrect() { + Optional firstNonNullElement = inputs.stream() + .filter(Objects::nonNull) + .findFirst(); + + assertTrue(firstNonNullElement.isPresent()); + } + +} From c3fe804379cb634d6e32c4e445690ba21b61a6de Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Sat, 9 Dec 2023 00:22:41 +0000 Subject: [PATCH 802/831] https://jira.baeldung.com/browse/BAEL-7169 --- .../java/com/baeldung/{finalstatic => staticfinal}/Bike.java | 2 +- .../com/baeldung/{finalstatic => staticfinal}/BikeUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/core-java-lang-6/src/main/java/com/baeldung/{finalstatic => staticfinal}/Bike.java (87%) rename core-java-modules/core-java-lang-6/src/test/java/com/baeldung/{finalstatic => staticfinal}/BikeUnitTest.java (95%) diff --git a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java similarity index 87% rename from core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java rename to core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java index 6467ccc395..bde7b44897 100644 --- a/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/finalstatic/Bike.java +++ b/core-java-modules/core-java-lang-6/src/main/java/com/baeldung/staticfinal/Bike.java @@ -1,4 +1,4 @@ -package com.baeldung.finalstatic; +package com.baeldung.staticfinal; import java.util.HashMap; diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java rename to core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java index 7b32b0906c..2201dae4d1 100644 --- a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/finalstatic/BikeUnitTest.java +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/staticfinal/BikeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.finalstatic; +package com.baeldung.staticfinal; import org.junit.jupiter.api.Test; From 36cc0c07eb809450f5683af2f478391ca97bc2c8 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Sat, 9 Dec 2023 12:20:58 -0300 Subject: [PATCH 803/831] fix embedded kafka port (#15296) --- .../ManagingConsumerGroupsIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java index 1620add9ca..ddbb105a67 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/managingkafkaconsumergroups/ManagingConsumerGroupsIntegrationTest.java @@ -14,7 +14,7 @@ import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest(classes = ManagingConsumerGroupsApplicationKafkaApp.class) -@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9092", "port=9092"}) +@EmbeddedKafka(partitions = 2, brokerProperties = {"listeners=PLAINTEXT://localhost:9098", "port=9098"}) public class ManagingConsumerGroupsIntegrationTest { private static final String CONSUMER_1_IDENTIFIER = "org.springframework.kafka.KafkaListenerEndpointContainer#1"; From bb989a8fe3fa15d0977d48df2a3f1f382f6dbec3 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 9 Dec 2023 20:40:53 +0200 Subject: [PATCH 804/831] [JAVA-27235] Moved article "Spring Custom Property Editor" to spring-boot-data-2 (#15381) --- spring-boot-modules/spring-boot-data-2/README.md | 2 +- .../com/baeldung/propertyeditor/PropertyEditorApplication.java | 0 .../baeldung/propertyeditor/PropertyEditorRestController.java | 0 .../java/com/baeldung/propertyeditor/creditcard/CreditCard.java | 0 .../baeldung/propertyeditor/creditcard/CreditCardEditor.java | 0 .../exotictype/editor/CustomExoticTypeEditor.java | 0 .../baeldung/propertyeditor/exotictype/model/ExoticType.java | 0 .../propertyeditor/creditcard/CreditCardEditorUnitTest.java | 0 spring-boot-modules/spring-boot-data/README.md | 1 - 9 files changed, 1 insertion(+), 2 deletions(-) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java (100%) rename spring-boot-modules/{spring-boot-data => spring-boot-data-2}/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java (100%) diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md index 8e6619dce4..b8f0347453 100644 --- a/spring-boot-modules/spring-boot-data-2/README.md +++ b/spring-boot-modules/spring-boot-data-2/README.md @@ -6,4 +6,4 @@ - [Using JaVers for Data Model Auditing in Spring Data](https://www.baeldung.com/spring-data-javers-audit) - [BootstrapMode for JPA Repositories](https://www.baeldung.com/jpa-bootstrap-mode) - [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) - +- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorApplication.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/PropertyEditorRestController.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCard.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/creditcard/CreditCardEditor.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/editor/CustomExoticTypeEditor.java diff --git a/spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java rename to spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/propertyeditor/exotictype/model/ExoticType.java diff --git a/spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java similarity index 100% rename from spring-boot-modules/spring-boot-data/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java rename to spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java diff --git a/spring-boot-modules/spring-boot-data/README.md b/spring-boot-modules/spring-boot-data/README.md index aa745b77a2..49a6eedbed 100644 --- a/spring-boot-modules/spring-boot-data/README.md +++ b/spring-boot-modules/spring-boot-data/README.md @@ -8,7 +8,6 @@ This module contains articles about Spring Boot with Spring Data - [Rendering Exceptions in JSON with Spring](https://www.baeldung.com/spring-exceptions-json) - [Disable Spring Data Auto Configuration](https://www.baeldung.com/spring-data-disable-auto-config) - [Repositories with Multiple Spring Data Modules](https://www.baeldung.com/spring-multiple-data-modules) -- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) - [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) - [Guide To Running Logic on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) - [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper) From f624403a861b0bdb49fa18ead928c0b689ba92f0 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sat, 9 Dec 2023 21:15:35 +0200 Subject: [PATCH 805/831] [JAVA-28185] (#15367) * [JAVA-28185] Moved code for article(Introduction to HtmlUnit) to spring-mvc-java-2 * [JAVA-28185] Moved code for article(Upload and Display Excel Files with Spring MVC) to spring-mvc-java-2 * [JAVA-28185] Clean up * [JAVA-28185] --- .../spring-mvc-java-2/README.md | 2 + spring-web-modules/spring-mvc-java-2/pom.xml | 56 +++++++++++++++++++ .../com/baeldung/excel}/ExcelController.java | 19 ++++--- .../com/baeldung/excel/ExcelPOIHelper.java | 34 +++++------ .../main/java/com/baeldung/excel/MyCell.java | 0 .../java/com/baeldung/excel/WebConfig.java | 32 +++++++++++ .../htmlunit/HtmlUnitAndJUnitLiveTest.java | 0 .../htmlunit/HtmlUnitAndSpringLiveTest.java | 0 .../htmlunit/HtmlUnitWebScrapingLiveTest.java | 0 .../com/baeldung/htmlunit/TestConfig.java | 4 +- spring-web-modules/spring-mvc-java/README.md | 2 - spring-web-modules/spring-mvc-java/pom.xml | 27 +-------- .../baeldung/spring/web/config/WebConfig.java | 6 -- 13 files changed, 121 insertions(+), 61 deletions(-) rename spring-web-modules/{spring-mvc-java/src/main/java/com/baeldung/web/controller => spring-mvc-java-2/src/main/java/com/baeldung/excel}/ExcelController.java (96%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/excel/ExcelPOIHelper.java (99%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/main/java/com/baeldung/excel/MyCell.java (100%) create mode 100644 spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java (100%) rename spring-web-modules/{spring-mvc-java => spring-mvc-java-2}/src/test/java/com/baeldung/htmlunit/TestConfig.java (99%) diff --git a/spring-web-modules/spring-mvc-java-2/README.md b/spring-web-modules/spring-mvc-java-2/README.md index 1f8231bada..61549b539a 100644 --- a/spring-web-modules/spring-mvc-java-2/README.md +++ b/spring-web-modules/spring-mvc-java-2/README.md @@ -5,3 +5,5 @@ - [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables) - [Converting a Spring MultipartFile to a File](https://www.baeldung.com/spring-multipartfile-to-file) - [Testing a Spring Multipart POST Request](https://www.baeldung.com/spring-multipart-post-request-test) +- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit) +- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files) diff --git a/spring-web-modules/spring-mvc-java-2/pom.xml b/spring-web-modules/spring-mvc-java-2/pom.xml index b1b5a797f8..a4484ed56d 100644 --- a/spring-web-modules/spring-mvc-java-2/pom.xml +++ b/spring-web-modules/spring-mvc-java-2/pom.xml @@ -46,6 +46,57 @@ commons-fileupload ${commons-fileupload.version} + + net.sourceforge.htmlunit + htmlunit + ${htmlunit.version} + + + commons-logging + commons-logging + + + commons-io + commons-io + + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.glassfish + javax.el + ${javax.el.version} + + + javax.servlet.jsp + javax.servlet.jsp-api + ${javax-servlet-api.version} + + + javax.servlet + jstl + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + org.thymeleaf + thymeleaf-spring4 + ${thymeleaf.version} + + + org.thymeleaf + thymeleaf + ${thymeleaf.version} + @@ -63,6 +114,11 @@ 5.2.2.RELEASE 2.3.5 1.5 + 2.32 + 3.16-beta1 + 3.0.1-b09 + 2.3.3 + 3.0.9.RELEASE \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java similarity index 96% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java index f76f7441a5..5cb5de7124 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/web/controller/ExcelController.java +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelController.java @@ -1,18 +1,19 @@ -package com.baeldung.web.controller; +package com.baeldung.excel; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import com.baeldung.excel.*; -import java.util.Map; -import java.util.List; -import javax.annotation.Resource; @Controller public class ExcelController { diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java similarity index 99% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java index 0519a8f3c7..7a213d523b 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/ExcelPOIHelper.java +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/ExcelPOIHelper.java @@ -1,13 +1,14 @@ package com.baeldung.excel; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFCellStyle; -import org.apache.poi.xssf.usermodel.XSSFColor; -import org.apache.poi.xssf.usermodel.XSSFFont; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; + import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; @@ -15,16 +16,15 @@ import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelPOIHelper { diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/excel/MyCell.java rename to spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/MyCell.java diff --git a/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java new file mode 100644 index 0000000000..f6a4d4dba3 --- /dev/null +++ b/spring-web-modules/spring-mvc-java-2/src/main/java/com/baeldung/excel/WebConfig.java @@ -0,0 +1,32 @@ +package com.baeldung.excel; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = { "com.baeldung.excel" }) +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(final ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + } + + @Override + public void addResourceHandlers(final ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); + } + + + @Bean + public ExcelPOIHelper excelPOIHelper() { + return new ExcelPOIHelper(); + } +} diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java similarity index 100% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScrapingLiveTest.java diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java similarity index 99% rename from spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java rename to spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java index 75efd57ae4..6e55f01454 100644 --- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java +++ b/spring-web-modules/spring-mvc-java-2/src/test/java/com/baeldung/htmlunit/TestConfig.java @@ -20,7 +20,7 @@ public class TestConfig implements WebMvcConfigurer { @Autowired private ServletContext ctx; - + @Bean public ViewResolver thymeleafViewResolver() { final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); @@ -44,4 +44,4 @@ public class TestConfig implements WebMvcConfigurer { templateEngine.setTemplateResolver(templateResolver()); return templateEngine; } -} +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-java/README.md b/spring-web-modules/spring-mvc-java/README.md index 656e415f6a..d89f33fdc1 100644 --- a/spring-web-modules/spring-mvc-java/README.md +++ b/spring-web-modules/spring-mvc-java/README.md @@ -9,8 +9,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring ### Relevant Articles: - [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring) - [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload) -- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit) -- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files) - [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js) diff --git a/spring-web-modules/spring-mvc-java/pom.xml b/spring-web-modules/spring-mvc-java/pom.xml index 395b12a278..d4c8f24431 100644 --- a/spring-web-modules/spring-mvc-java/pom.xml +++ b/spring-web-modules/spring-mvc-java/pom.xml @@ -44,21 +44,7 @@ provided - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - - - commons-logging - commons-logging - - - commons-io - commons-io - - - + commons-io commons-io @@ -91,12 +77,7 @@ spring-boot-starter-test test - - - org.apache.poi - poi-ooxml - ${poi.version} - + org.hibernate.validator @@ -221,19 +202,15 @@ 4.4.5 4.5.2 - 2.23 2.7 1.6.1 3.1.0 1.9.1 - - 3.16-beta1 3.0.1-b09 4.0.1 2.3.3 - 2.32 2.8.0 com.baeldung.SpringMVCApplication diff --git a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 768fda1c4a..c135164a95 100644 --- a/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-web-modules/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -27,7 +27,6 @@ import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; import org.thymeleaf.templateresolver.ITemplateResolver; -import com.baeldung.excel.ExcelPOIHelper; @EnableWebMvc @Configuration @@ -118,11 +117,6 @@ public class WebConfig implements WebMvcConfigurer { configurer.setUrlPathHelper(urlPathHelper); } - @Bean - public ExcelPOIHelper excelPOIHelper() { - return new ExcelPOIHelper(); - } - @Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); From 94ddcd153d6431d5aa4b3c84b97c9636f6a3219f Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 10 Dec 2023 19:40:01 +0200 Subject: [PATCH 806/831] baeldung-articles : BAEL-6892 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit to adding two mеthods to convert OutputStream to a byte array. --- .../OutputStreamtoByteArrayUnitTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java new file mode 100644 index 0000000000..2e46a5c571 --- /dev/null +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.outputstreamtobytearray; + +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.*; + +public class OutputStreamtoByteArrayUnitTest { + + @Test + public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!"; + String filePath = "file.txt"; + + try (FileOutputStream outputStream = new FileOutputStream(filePath)) { + outputStream.write(data.getBytes()); + } + + byte[] byteArray = FileUtils.readFileToByteArray(new File(filePath)); + String result = new String(byteArray); + + Assertions.assertEquals(data, result); + } + + + @Test + public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!"; + String filePath = "file.txt"; + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); + drainableOutputStream.write(data.getBytes()); + byte[] intercepted = drainableOutputStream.toByteArray(); + String result = new String(intercepted); + Assertions.assertEquals(data, result); + } + + public class DrainableOutputStream extends FilterOutputStream { + private final ByteArrayOutputStream buffer; + + public DrainableOutputStream(OutputStream out) { + super(out); + this.buffer = new ByteArrayOutputStream(); + } + + @Override + public void write(byte b[]) throws IOException { + this.buffer.write(b); + super.write(b); + } + + public byte[] toByteArray() { + return this.buffer.toByteArray(); + } + } +} From 2dba12e694d8e84872b6a1796f953ea40cd6cbad Mon Sep 17 00:00:00 2001 From: mikr Date: Sun, 10 Dec 2023 18:58:04 +0100 Subject: [PATCH 807/831] Update readme --- core-java-modules/core-java-lang-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-lang-6/README.md b/core-java-modules/core-java-lang-6/README.md index 91c0e5212c..a49564a16a 100644 --- a/core-java-modules/core-java-lang-6/README.md +++ b/core-java-modules/core-java-lang-6/README.md @@ -9,3 +9,4 @@ This module contains articles about core features in the Java language - [Get a Random Element From a Set in Java](https://www.baeldung.com/java-set-draw-sample) - [Stop Executing Further Code in Java](https://www.baeldung.com/java-stop-running-code) - [Using the Apache Commons Lang 3 for Comparing Objects in Java](https://www.baeldung.com/java-apache-commons-lang-3-compare-objects) +- [Static Final Variables in Java](https://www.baeldung.com/java-static-final-variables) From b56eaf9b1b3d2fadead390b2e34f4ec55b1afb53 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Sun, 10 Dec 2023 20:53:59 +0200 Subject: [PATCH 808/831] Update OutputStreamtoByteArrayUnitTest.java --- .../OutputStreamtoByteArrayUnitTest.java | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java index 2e46a5c571..9cbca1ed24 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -1,26 +1,30 @@ package com.baeldung.outputstreamtobytearray; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; public class OutputStreamtoByteArrayUnitTest { @Test - public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray() throws IOException { + public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray(@TempDir Path tempDir) throws IOException { String data = "Welcome to Baeldung!"; - String filePath = "file.txt"; + String fileName = "file.txt"; + Path filePath = tempDir.resolve(fileName); - try (FileOutputStream outputStream = new FileOutputStream(filePath)) { - outputStream.write(data.getBytes()); + try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + drainableOutputStream.write(data.getBytes()); } - byte[] byteArray = FileUtils.readFileToByteArray(new File(filePath)); - String result = new String(byteArray); - - Assertions.assertEquals(data, result); + byte[] intercepted = Files.readAllBytes(filePath); + String result = new String(intercepted); + assertEquals(data, result); } @@ -28,11 +32,21 @@ public class OutputStreamtoByteArrayUnitTest { public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { String data = "Welcome to Baeldung!"; String filePath = "file.txt"; - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); - drainableOutputStream.write(data.getBytes()); - byte[] intercepted = drainableOutputStream.toByteArray(); + + DrainableOutputStream drainableOutputStream = null; + + try { + drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); + drainableOutputStream.write(data.getBytes()); + } finally { + if (drainableOutputStream != null) { + drainableOutputStream.close(); + } + } + + byte[] intercepted = Files.readAllBytes(Paths.get(filePath)); String result = new String(intercepted); - Assertions.assertEquals(data, result); + assertEquals(data, result); } public class DrainableOutputStream extends FilterOutputStream { @@ -45,12 +59,12 @@ public class OutputStreamtoByteArrayUnitTest { @Override public void write(byte b[]) throws IOException { - this.buffer.write(b); + buffer.write(b); super.write(b); } public byte[] toByteArray() { - return this.buffer.toByteArray(); + return buffer.toByteArray(); } } } From f7205747ffb02543978a778beff21b3cf7ffd016 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Sun, 10 Dec 2023 22:39:11 +0100 Subject: [PATCH 809/831] JAVA-26712 | jjwt update (#15344) * JAVA-26712 | jjwt update * removed unused related article * JAVA-26712 | fix --- jhipster-modules/README.md | 6 ++-- .../jhipster-microservice/car-app/pom.xml | 4 +-- .../car/app/security/jwt/TokenProvider.java | 4 +-- .../jhipster-microservice/dealer-app/pom.xml | 4 +-- .../app/security/jwt/TokenProvider.java | 4 +-- .../jhipster-microservice/gateway-app/pom.xml | 4 +-- .../gateway/security/jwt/TokenProvider.java | 4 +-- jhipster-modules/jhipster-monolithic/pom.xml | 4 +-- .../baeldung/security/jwt/TokenProvider.java | 4 +-- persistence-modules/spring-jpa-2/pom.xml | 4 +-- .../security/AuthenticationService.java | 8 +++-- security-modules/jjwt/pom.xml | 14 ++++++-- .../jjwtfun/config/WebSecurityConfig.java | 2 +- .../controller/DynamicJWTController.java | 4 +-- .../jjwtfun/controller/SecretsController.java | 3 +- .../controller/StaticJWTController.java | 4 +-- .../jjwtfun/service/SecretService.java | 34 +++++++++++-------- .../jjwtfun/util/JWTDecoderUtil.java | 33 ++++++++---------- .../jjwtfun/util/JWTDecoderUtilUnitTest.java | 10 +++--- 19 files changed, 82 insertions(+), 72 deletions(-) diff --git a/jhipster-modules/README.md b/jhipster-modules/README.md index 11c3d5397f..2aae8a5697 100644 --- a/jhipster-modules/README.md +++ b/jhipster-modules/README.md @@ -1,7 +1,5 @@ ## JHipster -This module contains articles about JHipster. - -### Relevant articles: - +This module contains articles about JHipster. +Relevant articles are listed in the nested module folders. diff --git a/jhipster-modules/jhipster-microservice/car-app/pom.xml b/jhipster-modules/jhipster-microservice/car-app/pom.xml index 87c289cb46..069a1f6848 100644 --- a/jhipster-modules/jhipster-microservice/car-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/car-app/pom.xml @@ -29,7 +29,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -216,7 +216,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java index 3908bfa8f3..028f34e3f0 100644 --- a/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/car-app/src/main/java/com/car/app/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml index f660463026..43f9b046c7 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/dealer-app/pom.xml @@ -28,7 +28,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -215,7 +215,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java index 47a5bf75af..38cee99e01 100644 --- a/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/dealer-app/src/main/java/com/dealer/app/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml index 7c95704da7..90d703b8c7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/pom.xml +++ b/jhipster-modules/jhipster-microservice/gateway-app/pom.xml @@ -31,7 +31,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.0.0 3.6 2.0.0 @@ -243,7 +243,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} diff --git a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java index 5ffb55f33e..14d343c0d7 100644 --- a/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-microservice/gateway-app/src/main/java/com/gateway/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/jhipster-modules/jhipster-monolithic/pom.xml b/jhipster-modules/jhipster-monolithic/pom.xml index bb82c819c4..f1ee479756 100644 --- a/jhipster-modules/jhipster-monolithic/pom.xml +++ b/jhipster-modules/jhipster-monolithic/pom.xml @@ -122,7 +122,7 @@ io.jsonwebtoken - jjwt + jjwt-api ${jjwt.version} @@ -897,7 +897,7 @@ 3.21.0-GA 1.0.0 1.1.0 - 0.7.0 + 0.12.3 1.1.3 3.6 2.0.0 diff --git a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java index 3ba4d7c793..095663065b 100644 --- a/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java +++ b/jhipster-modules/jhipster-monolithic/src/main/java/com/baeldung/security/jwt/TokenProvider.java @@ -70,7 +70,7 @@ public class TokenProvider { public Authentication getAuthentication(String token) { Claims claims = Jwts.parser() - .setSigningKey(secretKey) + .setSigningKey(secretKey).build() .parseClaimsJws(token) .getBody(); @@ -86,7 +86,7 @@ public class TokenProvider { public boolean validateToken(String authToken) { try { - Jwts.parser().setSigningKey(secretKey).parseClaimsJws(authToken); + Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(authToken); return true; } catch (SignatureException e) { log.info("Invalid JWT signature."); diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml index 9abf888fb2..c20c43912b 100644 --- a/persistence-modules/spring-jpa-2/pom.xml +++ b/persistence-modules/spring-jpa-2/pom.xml @@ -54,8 +54,8 @@ io.jsonwebtoken - jjwt - 0.9.1 + jjwt-api + 0.12.3 diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java index 00db7eebc4..42eab1d6de 100644 --- a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java +++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/multitenant/security/AuthenticationService.java @@ -30,7 +30,7 @@ public class AuthenticationService { if (token != null) { String user = Jwts.parser() .setSigningKey(SIGNINGKEY) - .parseClaimsJws(token.replace(PREFIX, "")) + .build().parseClaimsJws(token.replace(PREFIX, "")) .getBody() .getSubject(); if (user != null) { @@ -48,9 +48,11 @@ public class AuthenticationService { } String tenant = Jwts.parser() .setSigningKey(SIGNINGKEY) - .parseClaimsJws(token.replace(PREFIX, "")) + .build().parseClaimsJws(token.replace(PREFIX, "")) .getBody() - .getAudience(); + .getAudience() + .iterator() + .next(); return tenant; } } diff --git a/security-modules/jjwt/pom.xml b/security-modules/jjwt/pom.xml index 3ea4a46b8a..3693eaf9c4 100644 --- a/security-modules/jjwt/pom.xml +++ b/security-modules/jjwt/pom.xml @@ -35,13 +35,23 @@ io.jsonwebtoken - jjwt + jjwt-api + ${jjwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + + + io.jsonwebtoken + jjwt-jackson ${jjwt.version} - 0.7.0 + 0.12.3 \ No newline at end of file diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java index e453f33d5e..c0f176034e 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/config/WebSecurityConfig.java @@ -66,7 +66,7 @@ public class WebSecurityConfig { // CsrfFilter already made sure the token matched. Here, we'll make sure it's not expired try { Jwts.parser() - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(token.getToken()); } catch (JwtException e) { // most likely an ExpiredJwtException, but this will handle any diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java index 3d157827d1..1c29a753b6 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/DynamicJWTController.java @@ -4,7 +4,7 @@ import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.impl.compression.CompressionCodecs; +import io.jsonwebtoken.impl.compression.DeflateCompressionAlgorithm; import io.jsonwebtoken.jjwtfun.model.JwtResponse; import io.jsonwebtoken.jjwtfun.service.SecretService; import org.springframework.beans.factory.annotation.Autowired; @@ -38,7 +38,7 @@ public class DynamicJWTController extends BaseController { public JwtResponse dynamicBuildercompress(@RequestBody Map claims) throws UnsupportedEncodingException { String jws = Jwts.builder() .setClaims(claims) - .compressWith(CompressionCodecs.DEFLATE) + .compressWith(new DeflateCompressionAlgorithm()) .signWith(SignatureAlgorithm.HS256, secretService.getHS256SecretBytes()) .compact(); return new JwtResponse(jws); diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java index 1ca0973c33..4975385398 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/SecretsController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.security.NoSuchAlgorithmException; import java.util.Map; import static org.springframework.web.bind.annotation.RequestMethod.GET; @@ -23,7 +24,7 @@ public class SecretsController extends BaseController { } @RequestMapping(value = "/refresh-secrets", method = GET) - public Map refreshSecrets() { + public Map refreshSecrets() throws NoSuchAlgorithmException { return secretService.refreshSecrets(); } diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java index efafa4b1b7..4ff71a620e 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/controller/StaticJWTController.java @@ -42,7 +42,7 @@ public class StaticJWTController extends BaseController { public JwtResponse parser(@RequestParam String jwt) throws UnsupportedEncodingException { Jws jws = Jwts.parser() - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(jwt); return new JwtResponse(jws); @@ -53,7 +53,7 @@ public class StaticJWTController extends BaseController { Jws jws = Jwts.parser() .requireIssuer("Stormpath") .require("hasMotorcycle", true) - .setSigningKeyResolver(secretService.getSigningKeyResolver()) + .setSigningKeyResolver(secretService.getSigningKeyResolver()).build() .parseClaimsJws(jwt); return new JwtResponse(jws); diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java index 4426a4b9b0..958d6fb48f 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/service/SecretService.java @@ -6,12 +6,14 @@ import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SigningKeyResolver; import io.jsonwebtoken.SigningKeyResolverAdapter; import io.jsonwebtoken.impl.TextCodec; -import io.jsonwebtoken.impl.crypto.MacProvider; import io.jsonwebtoken.lang.Assert; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; +import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; + +import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; @@ -28,7 +30,7 @@ public class SecretService { }; @PostConstruct - public void setup() { + public void setup() throws NoSuchAlgorithmException { refreshSecrets(); } @@ -42,32 +44,34 @@ public class SecretService { public void setSecrets(Map secrets) { Assert.notNull(secrets); - Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getValue())); - Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getValue())); - Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getValue())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS256.getJcaName())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS384.getJcaName())); + Assert.hasText(secrets.get(SignatureAlgorithm.HS512.getJcaName())); this.secrets = secrets; } public byte[] getHS256SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS256.getJcaName())); } public byte[] getHS384SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS384.getJcaName())); } public byte[] getHS512SecretBytes() { - return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getValue())); + return TextCodec.BASE64.decode(secrets.get(SignatureAlgorithm.HS512.getJcaName())); } - public Map refreshSecrets() { - SecretKey key = MacProvider.generateKey(SignatureAlgorithm.HS256); - secrets.put(SignatureAlgorithm.HS256.getValue(), TextCodec.BASE64.encode(key.getEncoded())); - key = MacProvider.generateKey(SignatureAlgorithm.HS384); - secrets.put(SignatureAlgorithm.HS384.getValue(), TextCodec.BASE64.encode(key.getEncoded())); - key = MacProvider.generateKey(SignatureAlgorithm.HS512); - secrets.put(SignatureAlgorithm.HS512.getValue(), TextCodec.BASE64.encode(key.getEncoded())); + public Map refreshSecrets() throws NoSuchAlgorithmException { + SecretKey key = KeyGenerator.getInstance(SignatureAlgorithm.HS256.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS256.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); + + key = KeyGenerator.getInstance(SignatureAlgorithm.HS384.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS384.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); + + key = KeyGenerator.getInstance(SignatureAlgorithm.HS512.getJcaName()).generateKey(); + secrets.put(SignatureAlgorithm.HS512.getJcaName(), TextCodec.BASE64.encode(key.getEncoded())); return secrets; } } diff --git a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java index 0fbf7637dd..2fc97b0b51 100644 --- a/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java +++ b/security-modules/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java @@ -1,12 +1,14 @@ package io.jsonwebtoken.jjwtfun.util; +import io.jsonwebtoken.Jwt; +import io.jsonwebtoken.JwtParser; +import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.impl.crypto.DefaultJwtSignatureValidator; import javax.crypto.spec.SecretKeySpec; + import java.util.Base64; -import static io.jsonwebtoken.SignatureAlgorithm.HS256; public class JWTDecoderUtil { @@ -21,26 +23,19 @@ public class JWTDecoderUtil { return header + " " + payload; } - public static String decodeJWTToken(String token, String secretKey) throws Exception { - Base64.Decoder decoder = Base64.getUrlDecoder(); + public static boolean isTokenValid(String token, String secretKey) throws Exception { + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), SignatureAlgorithm.HS256.getJcaName()); - String[] chunks = token.split("\\."); + JwtParser jwtParser = Jwts.parser() + .verifyWith(secretKeySpec) + .build(); - String header = new String(decoder.decode(chunks[0])); - String payload = new String(decoder.decode(chunks[1])); - - String tokenWithoutSignature = chunks[0] + "." + chunks[1]; - String signature = chunks[2]; - - SignatureAlgorithm sa = HS256; - SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName()); - - DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec); - - if (!validator.isValid(tokenWithoutSignature, signature)) { - throw new Exception("Could not verify JWT token integrity!"); + try { + jwtParser.parse(token); + } catch (Exception e) { + throw new Exception("Could not verify JWT token integrity!", e); } - return header + " " + payload; + return true; } } diff --git a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java index 3103a6c8a3..4cdfdc59ba 100644 --- a/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java +++ b/security-modules/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java @@ -1,16 +1,16 @@ package io.jsonwebtoken.jjwtfun.util; import io.jsonwebtoken.SignatureAlgorithm; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertTrue; class JWTDecoderUtilUnitTest { private final static String SIMPLE_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9"; - private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE"; + private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.6h_QYBTbyKxfMq3TGiAhVI416rctV0c0SpzWxVm-0-Y"; @Test void givenSimpleToken_whenDecoding_thenStringOfHeaderPayloadAreReturned() { @@ -20,13 +20,13 @@ class JWTDecoderUtilUnitTest { @Test void givenSignedToken_whenDecodingWithInvalidSecret_thenIntegrityIsNotValidated() { - assertThatThrownBy(() -> JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "BAD_SECRET")) + assertThatThrownBy(() -> JWTDecoderUtil. + isTokenValid(SIGNED_TOKEN, "BAD_SECRET")) .hasMessage("Could not verify JWT token integrity!"); } @Test void givenSignedToken_whenDecodingWithValidSecret_thenIntegrityIsValidated() throws Exception { - assertThat(JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "MySecretKey")) - .contains("Baeldung User"); + assertTrue(JWTDecoderUtil.isTokenValid(SIGNED_TOKEN, "randomSecretWithSome!!CharacterS!")); } } From d1661c2bc723d05b272c37b80be4e1acc721cbc0 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Sun, 10 Dec 2023 23:41:16 +0200 Subject: [PATCH 810/831] JAVA-28506 Cleanup un-committed or un-ignored artifacts - Week 49 - 2023 (#15382) Co-authored-by: timis1 --- .../target/classes/org/example/Main.class | Bin 2912 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core-java-modules/core-java-swing/target/classes/org/example/Main.class diff --git a/core-java-modules/core-java-swing/target/classes/org/example/Main.class b/core-java-modules/core-java-swing/target/classes/org/example/Main.class deleted file mode 100644 index 5914458bc4b1b959f8d4cc18270605acd2f4249e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2912 zcmai0+jA3D82@dXWYe$+6hSHlQxI)RN(2FwVzrb614)at7F#cMn{JbZBpY`(wDo?! z-|yi4ikBH@d`ZEMjx#GmpU?u?9t5JZcLkcMSa+_JMV zV@5BO@ETC z^;yGBSs6XQBsbg{N&T08k8rkH!^K$Rnd&>Cn|XaAZzQauo6rkpes(}F7>1Uj3x)`j1X?Yh>D{cZWZV7L}V80BFqa(sti0-Ol zp>8~3Gq*uZFv$M0<64EVIA=KSO{5UU(IFm&hAGh3I>&JL8&i5Y@Al^{#~3ULATkvM zO=mJf4`%JSGLw00I;GEAWdb6HW??C>p#X}v(2~dEz-c&vx0lw7OpDzkES4^eIi*h+ z`5=gX|8V@)VGc?Q9YK@{La!miUMmSGO^XRI!;~&D0g?<@=-#8@UfjoqU`YRl1`dk{ zs{VEa@eo5=G=t>S5yyK(!=reNEu~LRa=0`cY@sv_qj+IcC_ka$NpUIoN_ytF*mzpQ zGkBIzVPqqwV{#sgM2|&A`0BSNxmuAji^f2?Fk#rkVqP;cc@2!{wkg)tO`n@H*%#zp zaNqRMQbFE3YZuMsYJW*jx}Bx&>c+8MWm7pZI4~^2Sk(Wt+LB5R4UZ>><7rN?#XV0g z!Q?gJ?bk<}P%~=X#V&3DalLUU({v!tF}vV#i7Ss%>-$FflBvFZsra~vaXitNPNqi3 z2l~=+wyl3kAfHo3npxZrR1Wa+GxFR2!I#*p^LKCnFV6OCsh08Z1!vpqt!s0ymqspM zTBPw_6=KVWT;d_Em#Vc44OwM7V~9JE`4S%u+eGrw!B2}Oev|;s-~kcf^Es|!d@FqW zyXK&LL!t@K^C{Rs2ruxdc>;J5FLBj^m+=aBgz^slg`DpU)CFDf(Id2)IZ+q%eRvhG zalb`;+j#m-QBnb#2%Ld-sH=k3GfY|VJG75B&-2l`aSq|3QJ_3Z}ns5rC zF0o1-J$?SC)6mjNw1VL?7@f!XXsbSlOgb8Nc-jHHQ-w%u3GvC}#=v4OP-Q+G49JMbnp;eA|zFK{KkMkmgq3qN8jenB_R zVH Date: Mon, 11 Dec 2023 00:49:27 +0200 Subject: [PATCH 811/831] [JAVA-28184] (#15366) * [JAVA-28184] Moved code for article(Custom Naming Convention with Spring Data JPA) to spring-data-jpa-enterprise-2 * [JAVA-28184] Moved code for article(Working with Lazy Element Collections in JPA) to spring-data-jpa-enterprise-2 --- .../spring-data-jpa-enterprise-2/README.md | 3 ++- .../ElementCollectionApplication.java | 0 .../elementcollection/model/Employee.java | 7 +++++- .../elementcollection/model/Phone.java | 3 ++- .../repository/EmployeeRepository.java | 12 ++++++---- .../com/baeldung/namingstrategy/Person.java | 1 - .../namingstrategy/PersonRepository.java | 0 .../QuotedLowerCaseNamingStrategy.java | 0 .../QuotedUpperCaseNamingStrategy.java | 0 ...ingDataJpaNamingConventionApplication.java | 0 .../UnquotedLowerCaseNamingStrategy.java | 0 .../UnquotedUpperCaseNamingStrategy.java | 0 .../ElementCollectionIntegrationTest.java | 15 ++++++------ ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...werCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...perCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...ysicalNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...hysicalNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 24 +++++++++---------- ...werCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...erCaseNamingStrategyH2IntegrationTest.java | 23 +++++++++--------- ...perCaseNamingStrategyPostgresLiveTest.java | 23 +++++++++--------- ...ase-naming-strategy-on-postgres.properties | 0 ...oted-lower-case-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-upper-case-naming-strategy.properties | 0 ...cal-naming-strategy-on-postgres.properties | 0 ...spring-physical-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-lower-case-naming-strategy.properties | 0 ...ase-naming-strategy-on-postgres.properties | 0 ...oted-upper-case-naming-strategy.properties | 0 .../spring-data-jpa-enterprise/README.md | 2 -- 34 files changed, 145 insertions(+), 129 deletions(-) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/model/Employee.java (87%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/model/Phone.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/Person.java (94%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/PersonRepository.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java (98%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java (99%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties (100%) rename persistence-modules/{spring-data-jpa-enterprise => spring-data-jpa-enterprise-2}/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties (100%) diff --git a/persistence-modules/spring-data-jpa-enterprise-2/README.md b/persistence-modules/spring-data-jpa-enterprise-2/README.md index 8e154f6b75..0c1e9968bc 100644 --- a/persistence-modules/spring-data-jpa-enterprise-2/README.md +++ b/persistence-modules/spring-data-jpa-enterprise-2/README.md @@ -3,7 +3,8 @@ This module contains articles about Spring Data JPA used in enterprise applications such as transactions, sessions, naming conventions and more ### Relevant Articles: - +- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) +- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections) ### Eclipse Config diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/ElementCollectionApplication.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java similarity index 87% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java index 8b98164d63..9bc0663016 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Employee.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Employee.java @@ -1,9 +1,14 @@ package com.baeldung.elementcollection.model; -import javax.persistence.*; import java.util.List; import java.util.Objects; +import javax.persistence.CollectionTable; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; + @Entity public class Employee { @Id diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java index d73d30c47a..15d05aea98 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/model/Phone.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/model/Phone.java @@ -1,8 +1,9 @@ package com.baeldung.elementcollection.model; -import javax.persistence.Embeddable; import java.util.Objects; +import javax.persistence.Embeddable; + @Embeddable public class Phone { private String type; diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java index 49180c35eb..996cac7cd9 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/elementcollection/repository/EmployeeRepository.java @@ -1,14 +1,16 @@ package com.baeldung.elementcollection.repository; -import com.baeldung.elementcollection.model.Employee; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.Map; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.HashMap; -import java.util.Map; + +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.elementcollection.model.Employee; @Repository public class EmployeeRepository { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java similarity index 94% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java index cfb6e67c2c..35dd2dc226 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/Person.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/Person.java @@ -1,6 +1,5 @@ package com.baeldung.namingstrategy; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/PersonRepository.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/PersonRepository.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/SpringDataJpaNamingConventionApplication.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java b/persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/main/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategy.java diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java index 306798aa68..ed2bb97252 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/elementcollection/ElementCollectionIntegrationTest.java @@ -1,8 +1,10 @@ package com.baeldung.elementcollection; -import com.baeldung.elementcollection.model.Employee; -import com.baeldung.elementcollection.model.Phone; -import com.baeldung.elementcollection.repository.EmployeeRepository; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import java.util.Arrays; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -12,10 +14,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; -import java.util.Arrays; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; +import com.baeldung.elementcollection.model.Employee; +import com.baeldung.elementcollection.model.Phone; +import com.baeldung.elementcollection.repository.EmployeeRepository; @RunWith(SpringRunner.class) @SpringBootTest(classes = ElementCollectionApplication.class) diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java index 71a4dbda3f..b3225175ca 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy.properties") class QuotedLowerCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java index 6b1c984600..b21fdf9edd 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-lower-case-naming-strategy-on-postgres.properties") class QuotedLowerCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java index f819327a5c..74f82f0d39 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-upper-case-naming-strategy.properties") class QuotedUpperCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java index bd23b81b4b..6741b09366 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/QuotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("quoted-upper-case-naming-strategy-on-postgres.properties") class QuotedUpperCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java index 1850fea173..dbbccdd61d 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy.properties") class SpringPhysicalNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java index e26ebb148d..760dacdaa2 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/SpringPhysicalNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("spring-physical-naming-strategy-on-postgres.properties") class SpringPhysicalNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java similarity index 98% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java index 6311c42e93..d0e86384b8 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,18 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy.properties") class UnquotedLowerCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java index 033a213cf5..121b184a3c 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedLowerCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-lower-case-naming-strategy-on-postgres.properties") class UnquotedLowerCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java index 7af8001854..b4f25605bd 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyH2IntegrationTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-upper-case-naming-strategy.properties") class UnquotedUpperCaseNamingStrategyH2IntegrationTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java similarity index 99% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java index 0151e7ece4..7ecd4cc80e 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java +++ b/persistence-modules/spring-data-jpa-enterprise-2/src/test/java/com/baeldung/namingstrategy/UnquotedUpperCaseNamingStrategyPostgresLiveTest.java @@ -1,5 +1,17 @@ package com.baeldung.namingstrategy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + import org.hibernate.exception.SQLGrammarException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -10,17 +22,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfigur import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.TestPropertySource; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - @DataJpaTest(excludeAutoConfiguration = TestDatabaseAutoConfiguration.class) @TestPropertySource("unquoted-upper-case-naming-strategy-on-postgres.properties") class UnquotedUpperCaseNamingStrategyPostgresLiveTest { diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-lower-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/quoted-upper-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/spring-physical-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-lower-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy-on-postgres.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties b/persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties similarity index 100% rename from persistence-modules/spring-data-jpa-enterprise/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties rename to persistence-modules/spring-data-jpa-enterprise-2/src/test/resources/com/baeldung/namingstrategy/unquoted-upper-case-naming-strategy.properties diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md index b563fa46d4..c48a519a87 100644 --- a/persistence-modules/spring-data-jpa-enterprise/README.md +++ b/persistence-modules/spring-data-jpa-enterprise/README.md @@ -7,8 +7,6 @@ This module contains articles about Spring Data JPA used in enterprise applicati - [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8) - [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test) - [A Guide to Spring’s Open Session in View](https://www.baeldung.com/spring-open-session-in-view) -- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections) -- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) - [Partial Data Update With Spring Data](https://www.baeldung.com/spring-data-partial-update) - [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation) - [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases) From d8c3be530b8088598ea79756825c3556be75a9b5 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 11 Dec 2023 09:58:51 +0200 Subject: [PATCH 812/831] [JAVA-26730] Upgraded io.projectreactor to latest version (#15234) --- aws-modules/aws-reactive/pom.xml | 3 +++ core-java-modules/core-java-streams-4/pom.xml | 4 ++-- docker-modules/docker-containers/pom.xml | 9 ++++++++- .../k8s-admission-controller/pom.xml | 6 ++++++ kubernetes-modules/kubernetes-spring/pom.xml | 5 +++++ libraries-http-2/pom.xml | 2 +- patterns-modules/axon/pom.xml | 3 +++ .../spring-data-cassandra-reactive/pom.xml | 3 +++ .../spring-data-mongodb-reactive/pom.xml | 5 +++-- reactor-core/pom.xml | 5 +++-- .../spring-boot-3-url-matching/pom.xml | 4 ++-- .../spring-cloud-netflix-sidecar-demo/pom.xml | 4 ++++ spring-reactive-modules/pom.xml | 15 +++++++++++++++ .../spring-reactive-client-2/pom.xml | 1 - .../spring-reactive-client/pom.xml | 1 - .../spring-reactive-data-couchbase/pom.xml | 2 -- .../spring-reactive-data/pom.xml | 10 ++++++---- .../spring-reactive-security/pom.xml | 5 +++-- spring-reactive-modules/spring-reactive/pom.xml | 2 +- spring-reactive-modules/spring-reactor/pom.xml | 7 ++++--- spring-websockets/pom.xml | 2 ++ 21 files changed, 74 insertions(+), 24 deletions(-) diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index 22bd62c2ee..965ce8fdcf 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -63,6 +63,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -93,6 +94,8 @@ 2.2.1.RELEASE 2.17.283 + 1.18.20 + 3.6.0 \ No newline at end of file diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml index e832cc1616..383f14d573 100644 --- a/core-java-modules/core-java-streams-4/pom.xml +++ b/core-java-modules/core-java-streams-4/pom.xml @@ -71,7 +71,7 @@ io.projectreactor reactor-core - ${io.reactor3.version} + ${reactor-core.version} org.apache.commons @@ -121,7 +121,7 @@ 2.2.2 3.1.5 1.0.0-alpha-4 - 3.5.1 + 3.6.0 4.4 10.4.1 diff --git a/docker-modules/docker-containers/pom.xml b/docker-modules/docker-containers/pom.xml index 79bf0aee72..f8b903c87d 100644 --- a/docker-modules/docker-containers/pom.xml +++ b/docker-modules/docker-containers/pom.xml @@ -27,6 +27,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -45,7 +46,7 @@ com.google.cloud.tools jib-maven-plugin - 2.7.1 + ${jib-maven-plugin.version} docker-demo-jib @@ -55,4 +56,10 @@ + + 3.6.0 + 2.7.1 + + + \ No newline at end of file diff --git a/kubernetes-modules/k8s-admission-controller/pom.xml b/kubernetes-modules/k8s-admission-controller/pom.xml index 4c41bf7ca0..6a1d695f8d 100644 --- a/kubernetes-modules/k8s-admission-controller/pom.xml +++ b/kubernetes-modules/k8s-admission-controller/pom.xml @@ -33,6 +33,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -79,4 +80,9 @@ + + 3.6.0 + + + \ No newline at end of file diff --git a/kubernetes-modules/kubernetes-spring/pom.xml b/kubernetes-modules/kubernetes-spring/pom.xml index 64322055d1..a9c780d59d 100644 --- a/kubernetes-modules/kubernetes-spring/pom.xml +++ b/kubernetes-modules/kubernetes-spring/pom.xml @@ -33,6 +33,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -46,4 +47,8 @@ + + + 3.6.0 + \ No newline at end of file diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index b49e4b9387..5e803cde8a 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -118,7 +118,7 @@ 2.3.0 5.1.9.RELEASE 1.0.3 - 3.2.12.RELEASE + 3.6.0 1.49 diff --git a/patterns-modules/axon/pom.xml b/patterns-modules/axon/pom.xml index 473a1b0e15..4d83f8f9e6 100644 --- a/patterns-modules/axon/pom.xml +++ b/patterns-modules/axon/pom.xml @@ -51,6 +51,7 @@ io.projectreactor reactor-core + ${reactor.version} com.h2database @@ -70,6 +71,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -114,6 +116,7 @@ 4.6.3 3.4.8 + 3.6.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml index cddb62186b..41f184e233 100644 --- a/persistence-modules/spring-data-cassandra-reactive/pom.xml +++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml @@ -23,6 +23,7 @@ io.projectreactor reactor-core + ${reactor.version} org.springframework.boot @@ -45,6 +46,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -57,6 +59,7 @@ 4.3.1.0 + 3.6.0 \ No newline at end of file diff --git a/persistence-modules/spring-data-mongodb-reactive/pom.xml b/persistence-modules/spring-data-mongodb-reactive/pom.xml index 46b2e8067f..ca45d4a758 100644 --- a/persistence-modules/spring-data-mongodb-reactive/pom.xml +++ b/persistence-modules/spring-data-mongodb-reactive/pom.xml @@ -18,7 +18,7 @@ io.projectreactor reactor-core - ${reactor-core.version} + ${reactor.version} org.springframework.boot @@ -40,6 +40,7 @@ io.projectreactor reactor-test + ${reactor.version} test @@ -126,7 +127,7 @@ 5.3.15 4.5.2 - 3.3.1.RELEASE + 3.6.0 \ No newline at end of file diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml index dd7533fe73..7bf34c93ad 100644 --- a/reactor-core/pom.xml +++ b/reactor-core/pom.xml @@ -29,7 +29,7 @@ io.projectreactor.addons reactor-extra - ${reactor.version} + ${reactor-extra.version} org.projectlombok @@ -40,7 +40,8 @@ - 3.5.1 + 3.6.0 + 3.5.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-url-matching/pom.xml b/spring-boot-modules/spring-boot-3-url-matching/pom.xml index 43f89eab47..42bd8583b3 100644 --- a/spring-boot-modules/spring-boot-3-url-matching/pom.xml +++ b/spring-boot-modules/spring-boot-3-url-matching/pom.xml @@ -96,8 +96,8 @@ 6.0.6 3.1.0 - 3.5.4 - 3.5.4> + 3.6.0 + 3.6.0> 3.0.0-M7 diff --git a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml index f8552aba93..60b68fc4bd 100644 --- a/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml +++ b/spring-cloud-modules/spring-cloud-netflix-sidecar/spring-cloud-netflix-sidecar-demo/pom.xml @@ -26,6 +26,7 @@ io.projectreactor reactor-core + ${reactor-core.version} org.springframework.boot @@ -53,4 +54,7 @@ + + 3.6.0 + \ No newline at end of file diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index 61a3c3d17d..c349707027 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -59,7 +59,22 @@ pom import + + io.projectreactor + reactor-core + ${reactor.version} + + + io.projectreactor + reactor-test + ${reactor.version} + test + + + 3.6.0 + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-client-2/pom.xml b/spring-reactive-modules/spring-reactive-client-2/pom.xml index 5d5f3ebc2e..f7d82053bb 100644 --- a/spring-reactive-modules/spring-reactive-client-2/pom.xml +++ b/spring-reactive-modules/spring-reactive-client-2/pom.xml @@ -135,7 +135,6 @@ 1.0.1.RELEASE 1.1.6 - 3.2.10.RELEASE 1.7.1 diff --git a/spring-reactive-modules/spring-reactive-client/pom.xml b/spring-reactive-modules/spring-reactive-client/pom.xml index fe53584cc9..634fef1273 100644 --- a/spring-reactive-modules/spring-reactive-client/pom.xml +++ b/spring-reactive-modules/spring-reactive-client/pom.xml @@ -117,7 +117,6 @@ io.projectreactor reactor-test - ${reactor-test.version} test diff --git a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml index e0b21087fa..84515fedeb 100644 --- a/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml +++ b/spring-reactive-modules/spring-reactive-data-couchbase/pom.xml @@ -29,7 +29,6 @@ io.projectreactor reactor-core - ${reactor-core.version} org.springframework.boot @@ -136,7 +135,6 @@ 5.2.2.RELEASE 4.5.2 1.5.23 - 3.3.1.RELEASE 2.2.6.RELEASE 2.17.1 diff --git a/spring-reactive-modules/spring-reactive-data/pom.xml b/spring-reactive-modules/spring-reactive-data/pom.xml index 576a1d9f86..d72072e419 100644 --- a/spring-reactive-modules/spring-reactive-data/pom.xml +++ b/spring-reactive-modules/spring-reactive-data/pom.xml @@ -13,9 +13,6 @@ 1.0.0-SNAPSHOT - - UTF-8 - @@ -63,7 +60,7 @@ javax.validation validation-api - 2.0.1.Final + ${validation-api.version} io.r2dbc @@ -71,4 +68,9 @@ + + UTF-8 + 2.0.1.Final + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-security/pom.xml b/spring-reactive-modules/spring-reactive-security/pom.xml index 25b9f4c38f..d501a03c46 100644 --- a/spring-reactive-modules/spring-reactive-security/pom.xml +++ b/spring-reactive-modules/spring-reactive-security/pom.xml @@ -82,7 +82,7 @@ io.projectreactor reactor-test - ${project-reactor-test.version} + ${reactor-test.version} test @@ -115,7 +115,8 @@ 1.1.3 1.0 1.0 - 3.1.6.RELEASE + 3.1.6.RELEASE + 3.4.29 \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive/pom.xml b/spring-reactive-modules/spring-reactive/pom.xml index f19809e302..04bd32d632 100644 --- a/spring-reactive-modules/spring-reactive/pom.xml +++ b/spring-reactive-modules/spring-reactive/pom.xml @@ -104,7 +104,7 @@ - 3.4.16 + 3.6.0 1.3.10 2.2.21 diff --git a/spring-reactive-modules/spring-reactor/pom.xml b/spring-reactive-modules/spring-reactor/pom.xml index c2635765f0..54a97b92de 100644 --- a/spring-reactive-modules/spring-reactor/pom.xml +++ b/spring-reactive-modules/spring-reactor/pom.xml @@ -27,17 +27,18 @@ io.projectreactor reactor-bus - ${reactor.version} + ${reactor-bus.version} io.projectreactor reactor-core - ${reactor.version} + ${reactor-core.version} - 2.0.8.RELEASE + 2.0.8.RELEASE + 2.0.8.RELEASE \ No newline at end of file diff --git a/spring-websockets/pom.xml b/spring-websockets/pom.xml index 6ca84c4946..d6c5fbe561 100644 --- a/spring-websockets/pom.xml +++ b/spring-websockets/pom.xml @@ -22,6 +22,7 @@ io.projectreactor reactor-core + ${reactor-core.version} com.github.javafaker @@ -45,6 +46,7 @@ + 3.6.0 1.0.2 From 4e0e51139b8f11903a218abd0de4250cb5addfdc Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:25:25 +0200 Subject: [PATCH 813/831] Update OutputStreamtoByteArrayUnitTest.java --- .../OutputStreamtoByteArrayUnitTest.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java index 9cbca1ed24..fa55623973 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java @@ -1,16 +1,16 @@ package com.baeldung.outputstreamtobytearray; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import java.io.*; -import java.nio.file.Files; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.nio.file.Paths; import static org.junit.Assert.assertEquals; -public class OutputStreamtoByteArrayUnitTest { +public class OutputStreamToByteArrayUnitTest { @Test public void givenFileOutputStream_whenUsingFileUtilsToReadTheFile_thenReturnByteArray(@TempDir Path tempDir) throws IOException { @@ -18,35 +18,29 @@ public class OutputStreamtoByteArrayUnitTest { String fileName = "file.txt"; Path filePath = tempDir.resolve(fileName); - try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { - drainableOutputStream.write(data.getBytes()); + try (FileOutputStream outputStream = new FileOutputStream(filePath.toFile())) { + outputStream.write(data.getBytes(StandardCharsets.UTF_8)); } - byte[] intercepted = Files.readAllBytes(filePath); - String result = new String(intercepted); + byte[] writtenData = FileUtils.readFileToByteArray(new File(filePath.toUri())); + String result = new String(writtenData, StandardCharsets.UTF_8); assertEquals(data, result); } @Test - public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray(@TempDir Path tempDir) throws IOException { String data = "Welcome to Baeldung!"; - String filePath = "file.txt"; + String fileName = "file.txt"; + Path filePath = tempDir.resolve(fileName); - DrainableOutputStream drainableOutputStream = null; - - try { - drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath)); - drainableOutputStream.write(data.getBytes()); - } finally { - if (drainableOutputStream != null) { - drainableOutputStream.close(); - } + try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); + byte[] writtenData = drainableOutputStream.toByteArray(); + assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); + } catch (IOException e) { + e.printStackTrace(); } - - byte[] intercepted = Files.readAllBytes(Paths.get(filePath)); - String result = new String(intercepted); - assertEquals(data, result); } public class DrainableOutputStream extends FilterOutputStream { From 3ca05da8590552d746efbf4d2707be418a6b2b2a Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:42:19 +0200 Subject: [PATCH 814/831] Update and rename OutputStreamtoByteArrayUnitTest.java to OutputStreamToByteArrayUnitTest.java --- ...yteArrayUnitTest.java => OutputStreamToByteArrayUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/{OutputStreamtoByteArrayUnitTest.java => OutputStreamToByteArrayUnitTest.java} (100%) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamtoByteArrayUnitTest.java rename to core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java From 47baa5041bd3cdc55125377024252e98eb3d6c71 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 19:36:34 +0200 Subject: [PATCH 815/831] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index fa55623973..0082e77cfe 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -22,7 +22,7 @@ public class OutputStreamToByteArrayUnitTest { outputStream.write(data.getBytes(StandardCharsets.UTF_8)); } - byte[] writtenData = FileUtils.readFileToByteArray(new File(filePath.toUri())); + byte[] writtenData = FileUtils.readFileToByteArray(filePath.toFile()); String result = new String(writtenData, StandardCharsets.UTF_8); assertEquals(data, result); } @@ -34,15 +34,19 @@ public class OutputStreamToByteArrayUnitTest { String fileName = "file.txt"; Path filePath = tempDir.resolve(fileName); - try (DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile()))) { + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); + + try { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); - byte[] writtenData = drainableOutputStream.toByteArray(); - assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); - } catch (IOException e) { - e.printStackTrace(); + } finally { + drainableOutputStream.close(); } + + byte[] writtenData = drainableOutputStream.toByteArray(); + assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); } + public class DrainableOutputStream extends FilterOutputStream { private final ByteArrayOutputStream buffer; From 0235abe7e35412b6fc72e9d68037e46344bfa63e Mon Sep 17 00:00:00 2001 From: Kasra Madadipouya Date: Mon, 11 Dec 2023 18:39:03 +0100 Subject: [PATCH 816/831] JAVA-29186 fix failing integration test (#15400) --- .../logging/WebClientLoggingIntegrationTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index e1eefe4d61..27dde13608 100644 --- a/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-reactive-modules/spring-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -2,6 +2,7 @@ package com.baeldung.reactive.logging; import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance; import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -136,9 +137,7 @@ public class WebClientLoggingIntegrationTest { public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { WebClient .builder() - .filters(exchangeFilterFunctions -> { - exchangeFilterFunctions.addAll(LogFilters.prepareFilters()); - }) + .filters(exchangeFilterFunctions -> exchangeFilterFunctions.addAll(LogFilters.prepareFilters())) .build() .post() .uri(sampleUrl) @@ -146,8 +145,6 @@ public class WebClientLoggingIntegrationTest { .exchange() .block(); - verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); + verify(mockAppender, atLeast(1)).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleUrl))); } - - } From ec8fe08bb86fdc82222fd6369458de973fa50fed Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 11 Dec 2023 18:48:24 +0100 Subject: [PATCH 817/831] JAVA-29073 | removing harperDB jar (#15402) --- persistence-modules/java-harperdb/pom.xml | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/persistence-modules/java-harperdb/pom.xml b/persistence-modules/java-harperdb/pom.xml index 318f4b7460..7340aa4dbc 100644 --- a/persistence-modules/java-harperdb/pom.xml +++ b/persistence-modules/java-harperdb/pom.xml @@ -31,6 +31,7 @@ java-harperdb ${haperdb-driver.version} system + ${project.basedir}/lib/cdata.jdbc.harperdb.jar diff --git a/pom.xml b/pom.xml index ac7d12a5a0..0e8acff1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -817,7 +817,7 @@ pdf performance-tests persistence-modules - persistence-modules/java-harperdb + persistence-modules/spring-data-neo4j protobuffer quarkus-modules From 7f894fe513c9a97dd56e797355a848a8806af918 Mon Sep 17 00:00:00 2001 From: Gaetano Piazzolla Date: Mon, 11 Dec 2023 18:54:21 +0100 Subject: [PATCH 818/831] JAVA-29164 | fixing failing test (#15401) --- apache-kafka/pom.xml | 1 + ...atorIntegrationTest.java => BackupCreatorUnitTest.java} | 2 +- ...erIntegrationTest.java => WordCapitalizerUnitTest.java} | 2 +- .../com/baeldung/kafkastreams/KafkaStreamsLiveTest.java | 7 +++---- 4 files changed, 6 insertions(+), 6 deletions(-) rename apache-kafka/src/test/java/com/baeldung/flink/{BackupCreatorIntegrationTest.java => BackupCreatorUnitTest.java} (99%) rename apache-kafka/src/test/java/com/baeldung/flink/{WordCapitalizerIntegrationTest.java => WordCapitalizerUnitTest.java} (95%) diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml index 22be7a83c6..6aa5fb894a 100644 --- a/apache-kafka/pom.xml +++ b/apache-kafka/pom.xml @@ -181,6 +181,7 @@ + 2.13.4 3.4.0 1.19.3 1.15.3 diff --git a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java similarity index 99% rename from apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java rename to apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java index f46fffbb59..046a9bb9ec 100644 --- a/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorIntegrationTest.java +++ b/apache-kafka/src/test/java/com/baeldung/flink/BackupCreatorUnitTest.java @@ -29,7 +29,7 @@ import java.util.List; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -public class BackupCreatorIntegrationTest { +public class BackupCreatorUnitTest { public static ObjectMapper mapper; @Before diff --git a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java similarity index 95% rename from apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java rename to apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java index 8a98dae4b5..c521cfa62e 100644 --- a/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerIntegrationTest.java +++ b/apache-kafka/src/test/java/com/baeldung/flink/WordCapitalizerUnitTest.java @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -public class WordCapitalizerIntegrationTest { +public class WordCapitalizerUnitTest { @Test public void givenDataSet_whenExecuteWordCapitalizer_thenReturnCapitalizedWords() throws Exception { diff --git a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java index 3b559b619e..c733a4a1f4 100644 --- a/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java +++ b/apache-kafka/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java @@ -21,8 +21,7 @@ import org.junit.Ignore; import org.junit.Test; public class KafkaStreamsLiveTest { - private String bootstrapServers = "localhost:9092"; - private Path stateDirectory; + private final String bootstrapServers = "localhost:9092"; @Test @Ignore("it needs to have kafka broker running on local") @@ -44,8 +43,8 @@ public class KafkaStreamsLiveTest { // Use a temporary directory for storing state, which will be automatically removed after the test. try { - this.stateDirectory = Files.createTempDirectory("kafka-streams"); - streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, this.stateDirectory.toAbsolutePath() + Path stateDirectory = Files.createTempDirectory("kafka-streams"); + streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, stateDirectory.toAbsolutePath() .toString()); } catch (final IOException e) { throw new UncheckedIOException("Cannot create temporary directory", e); From 84bf4ee9564772a1bbd372994771ae6e3bec4835 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 23:08:50 +0200 Subject: [PATCH 819/831] Update core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java Co-authored-by: Liam Williams --- .../OutputStreamToByteArrayUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 0082e77cfe..f96926c81c 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -8,7 +8,7 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class OutputStreamToByteArrayUnitTest { From dc98a1c3020c2407d5f9e9e31dd43ee00ddf32b0 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Mon, 11 Dec 2023 23:08:59 +0200 Subject: [PATCH 820/831] Update core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java Co-authored-by: Liam Williams --- .../OutputStreamToByteArrayUnitTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index f96926c81c..16dfd68349 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -35,11 +35,8 @@ public class OutputStreamToByteArrayUnitTest { Path filePath = tempDir.resolve(fileName); DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); - - try { + try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); - } finally { - drainableOutputStream.close(); } byte[] writtenData = drainableOutputStream.toByteArray(); From 0323a8168c7ecf9f0991c5c0116272ba95734be3 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Wed, 13 Dec 2023 04:38:31 +0100 Subject: [PATCH 821/831] [sum-intarray-recursion] two recursion approaches to summing int-array (#15385) --- core-java-modules/core-java-lang-6/pom.xml | 16 +++++ .../RecursivelySumIntArrayUnitTest.java | 38 ++++++++++++ .../SumArrayBenchmark.java | 61 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java create mode 100644 core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java diff --git a/core-java-modules/core-java-lang-6/pom.xml b/core-java-modules/core-java-lang-6/pom.xml index 54035c1eb0..a47ed459f6 100644 --- a/core-java-modules/core-java-lang-6/pom.xml +++ b/core-java-modules/core-java-lang-6/pom.xml @@ -23,6 +23,16 @@ commons-lang3 ${commons-lang3.version} + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -39,6 +49,11 @@ mapstruct-processor ${mapstruct.version} + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + @@ -50,6 +65,7 @@ 17 UTF-8 1.6.0.Beta1 + 1.37 \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java new file mode 100644 index 0000000000..fc61a806e1 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/RecursivelySumIntArrayUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.recursivelysumintarray; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class RecursivelySumIntArrayUnitTest { + + private static final int[] INT_ARRAY = { 1, 2, 3, 4, 5 }; + + static int sumIntArray1(int[] array) { + if (array.length == 1) { + return array[0]; + } else { + return array[0] + sumIntArray1(Arrays.copyOfRange(array, 1, array.length)); + } + } + + static int sumIntArray2(int[] array, int index) { + if (index == 0) { + return array[index]; + } else { + return array[index] + sumIntArray2(array, index - 1); + } + } + + @Test + void whenUsingSumIntArray1_thenGetExpectedResult() { + assertEquals(15, sumIntArray1(INT_ARRAY)); + } + + @Test + void whenUsingSumIntArray2_thenGetExpectedResult() { + assertEquals(15, sumIntArray2(INT_ARRAY, INT_ARRAY.length - 1)); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java new file mode 100644 index 0000000000..7d6a612a8d --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/recursivelysumintarray/SumArrayBenchmark.java @@ -0,0 +1,61 @@ +package com.baeldung.recursivelysumintarray; + +import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray1; +import static com.baeldung.recursivelysumintarray.RecursivelySumIntArrayUnitTest.sumIntArray2; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@State(Scope.Thread) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Warmup(iterations = 2) +@Fork(1) +@Measurement(iterations = 5) +public class SumArrayBenchmark { + + public static void main(String[] args) throws Exception { + Options options = new OptionsBuilder().include(SumArrayBenchmark.class.getSimpleName()) + .build(); + new Runner(options).run(); + } + + @Param({ "10", "10000" }) + public int size; + int[] array; + + @Setup + public void setup() { + var r = new Random(); + array = new int[size]; + + for (int i = 0; i < size; i++) { + array[i] = r.nextInt(); + } + } + + @Benchmark + public int withArrayCopy() { + return sumIntArray1(array); + } + + @Benchmark + public int withoutArrayCopy() { + return sumIntArray2(array, array.length - 1); + } +} \ No newline at end of file From 8daf19c9ec9595c41120404a4bf22122c4918344 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:40:13 +0200 Subject: [PATCH 822/831] [JAVA-22519] Created new module libraries-stream and added 5 articles (#15403) --- asm/README.md | 7 - asm/pom.xml | 54 --- libraries-2/README.md | 3 - libraries-2/pom.xml | 24 -- libraries-3/README.md | 2 - libraries-3/pom.xml | 19 +- libraries-4/README.md | 2 - libraries-4/pom.xml | 36 +- libraries-5/README.md | 2 - libraries-5/pom.xml | 16 - libraries-6/README.md | 1 - libraries-6/pom.xml | 6 - libraries-bytecode/.gitignore | 9 + libraries-bytecode/README.md | 9 + libraries-bytecode/pom.xml | 85 +++++ .../com/baeldung}/asm/CustomClassWriter.java | 320 +++++++++--------- .../asm/instrumentation/Premain.java | 4 +- .../main/java/com/baeldung/bytebuddy/Bar.java | 0 .../main/java/com/baeldung/bytebuddy/Foo.java | 0 .../java/com/baeldung/javasisst/Point.java | 0 .../javasisst/ThreeDimensionalPoint.java | 0 .../src/main/resources/logback.xml | 0 .../baeldung/bytebuddy/ByteBuddyUnitTest.java | 19 +- .../baeldung/javassist/JavasisstUnitTest.java | 0 libraries-cli/.gitignore | 9 + libraries-cli/README.md | 9 + libraries-cli/pom.xml | 69 ++++ .../com/baeldung/airline/CommandLine.java | 0 .../airline/DatabaseSetupCommand.java | 0 .../com/baeldung/airline/LoggingCommand.java | 0 .../jcommander/helloworld/HelloWorldApp.java | 0 .../usagebilling/UsageBasedBillingApp.java | 0 .../cli/FetchCurrentChargesCommand.java | 11 +- .../usagebilling/cli/SubmitUsageCommand.java | 13 +- .../usagebilling/cli/UsageBasedBilling.java | 0 .../converter/ISO8601TimestampConverter.java | 6 +- .../cli/splitter/ColonParameterSplitter.java | 4 +- .../cli/validator/UUIDValidator.java | 4 +- .../model/CurrentChargesRequest.java | 8 +- .../model/CurrentChargesResponse.java | 8 +- .../usagebilling/model/UsageRequest.java | 8 +- .../DefaultFetchCurrentChargesService.java | 16 +- .../service/DefaultSubmitUsageService.java | 4 +- .../service/FetchCurrentChargesService.java | 0 .../service/SubmitUsageService.java | 0 .../com/baeldung/picocli/git/Application.java | 10 +- .../git/commands/declarative/GitCommand.java | 13 +- .../git/commands/methods/GitCommand.java | 4 +- .../commands/programmative/GitCommand.java | 12 +- .../commands/subcommands/GitAddCommand.java | 4 +- .../subcommands/GitCommitCommand.java | 4 +- .../subcommands/GitConfigCommand.java | 7 +- .../picocli/git/model/ConfigElement.java | 0 .../picocli/helloworld/HelloWorldCommand.java | 4 +- libraries-cli/src/main/resources/logback.xml | 13 + .../helloworld/HelloWorldAppUnitTest.java | 5 +- .../FetchCurrentChargesCommandUnitTest.java | 7 +- .../cli/SubmitUsageCommandUnitTest.java | 9 +- libraries-reporting/.gitignore | 9 + libraries-reporting/README.md | 8 + libraries-reporting/pom.xml | 75 ++++ .../java/com/baeldung/jasperreports/Main.java | 0 .../jasperreports/SimpleReportExporter.java | 0 .../jasperreports/SimpleReportFiller.java | 0 .../config/JasperRerportsSimpleConfig.java | 0 .../com/baeldung/yarg/DocumentController.java | 17 +- .../src/main/resources/employee-schema.sql | 0 .../main/resources/employeeEmailReport.jrxml | 0 .../src/main/resources/employeeReport.jrxml | 0 .../src/main/resources/logback.xml | 13 + libraries-stream/.gitignore | 9 + libraries-stream/README.md | 11 + libraries-stream/pom.xml | 59 ++++ .../distinct/DistinctWithJavaFunction.java | 0 .../java/com/baeldung/distinct/Person.java | 0 .../main/java/com/baeldung/streamex/Role.java | 0 .../java/com/baeldung/streamex/StreamEX.java | 1 + .../main/java/com/baeldung/streamex/User.java | 0 .../src/main/resources/logback.xml | 13 + ...istinctWithEclipseCollectionsUnitTest.java | 0 .../DistinctWithJavaFunctionUnitTest.java | 2 +- .../DistinctWithStreamexUnitTest.java | 0 .../distinct/DistinctWithVavrUnitTest.java | 0 .../distinct/PersonDataGenerator.java | 0 .../ParallelCollectorsUnitTest.java | 0 .../protonpack/ProtonpackUnitTest.java | 21 +- .../stream/JoolMergeStreamsUnitTest.java | 0 .../baeldung/stream/MergeStreamsUnitTest.java | 0 .../StreamExMergeStreamsUnitTest.java | 7 +- libraries/README.md | 2 - libraries/pom.xml | 12 - pom.xml | 10 +- 92 files changed, 718 insertions(+), 430 deletions(-) delete mode 100644 asm/README.md delete mode 100644 asm/pom.xml create mode 100644 libraries-bytecode/.gitignore create mode 100644 libraries-bytecode/README.md create mode 100644 libraries-bytecode/pom.xml rename {asm/src/main/java/com/baeldung/examples => libraries-bytecode/src/main/java/com/baeldung}/asm/CustomClassWriter.java (96%) rename {asm/src/main/java/com/baeldung/examples => libraries-bytecode/src/main/java/com/baeldung}/asm/instrumentation/Premain.java (88%) rename {libraries-5 => libraries-bytecode}/src/main/java/com/baeldung/bytebuddy/Bar.java (100%) rename {libraries-5 => libraries-bytecode}/src/main/java/com/baeldung/bytebuddy/Foo.java (100%) rename {libraries => libraries-bytecode}/src/main/java/com/baeldung/javasisst/Point.java (100%) rename {libraries => libraries-bytecode}/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java (100%) rename {asm => libraries-bytecode}/src/main/resources/logback.xml (100%) rename {libraries-5 => libraries-bytecode}/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java (93%) rename {libraries => libraries-bytecode}/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java (100%) create mode 100644 libraries-cli/.gitignore create mode 100644 libraries-cli/README.md create mode 100644 libraries-cli/pom.xml rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/CommandLine.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/airline/LoggingCommand.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java (99%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java (99%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java (70%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java (91%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java (89%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java (100%) rename {libraries-3 => libraries-cli}/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/Application.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java (99%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java (100%) rename {libraries-2 => libraries-cli}/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java (100%) create mode 100644 libraries-cli/src/main/resources/logback.xml rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java (99%) rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java (99%) rename {libraries-3 => libraries-cli}/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java (95%) create mode 100644 libraries-reporting/.gitignore create mode 100644 libraries-reporting/README.md create mode 100644 libraries-reporting/pom.xml rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/Main.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java (100%) rename {libraries-2 => libraries-reporting}/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java (100%) rename {libraries-4 => libraries-reporting}/src/main/java/com/baeldung/yarg/DocumentController.java (99%) rename {libraries-2 => libraries-reporting}/src/main/resources/employee-schema.sql (100%) rename {libraries-2 => libraries-reporting}/src/main/resources/employeeEmailReport.jrxml (100%) rename {libraries-2 => libraries-reporting}/src/main/resources/employeeReport.jrxml (100%) create mode 100644 libraries-reporting/src/main/resources/logback.xml create mode 100644 libraries-stream/.gitignore create mode 100644 libraries-stream/README.md create mode 100644 libraries-stream/pom.xml rename {libraries-4 => libraries-stream}/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java (100%) rename {libraries-4 => libraries-stream}/src/main/java/com/baeldung/distinct/Person.java (100%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/Role.java (100%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/StreamEX.java (99%) rename {libraries-5 => libraries-stream}/src/main/java/com/baeldung/streamex/User.java (100%) create mode 100644 libraries-stream/src/main/resources/logback.xml rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java (100%) rename {libraries-4 => libraries-stream}/src/test/java/com/baeldung/distinct/PersonDataGenerator.java (100%) rename {libraries-2 => libraries-stream}/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java (100%) rename {libraries-6 => libraries-stream}/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java (99%) rename {libraries => libraries-stream}/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java (100%) rename {libraries => libraries-stream}/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java (100%) rename {libraries-5 => libraries-stream}/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java (99%) diff --git a/asm/README.md b/asm/README.md deleted file mode 100644 index e10cdc45bd..0000000000 --- a/asm/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## ASM - -This module contains articles about ASM - -### Relevant Articles: - -- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm) diff --git a/asm/pom.xml b/asm/pom.xml deleted file mode 100644 index 4edfe86ae5..0000000000 --- a/asm/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - com.baeldung.examples - asm - 1.0 - asm - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.ow2.asm - asm - ${asm.version} - - - org.ow2.asm - asm-util - ${asm.version} - - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - - com.baeldung.examples.asm.instrumentation.Premain - - - - - - - - - - 5.2 - - - \ No newline at end of file diff --git a/libraries-2/README.md b/libraries-2/README.md index 8dae12a1cf..3eb788a34a 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -10,13 +10,10 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### Relevant articles - [A Guide to jBPM with Java](https://www.baeldung.com/jbpm-java) - [Guide to Classgraph Library](https://www.baeldung.com/classgraph) -- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program) -- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors) - [Templating with Handlebars](https://www.baeldung.com/handlebars) - [A Guide to Crawler4j](https://www.baeldung.com/crawler4j) - [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) - [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) -- [JasperReports with Spring](https://www.baeldung.com/spring-jasper) - More articles [[<-- prev]](/libraries) [[next -->]](/libraries-3) diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index d9b0545d54..9eff129a63 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -18,11 +18,6 @@ mapdb ${mapdb.version} - - com.pivovarit - parallel-collectors - ${parallel-collectors.version} - io.github.classgraph classgraph @@ -41,11 +36,6 @@ - - info.picocli - picocli - ${picocli.version} - org.springframework.boot spring-boot-starter @@ -83,17 +73,6 @@ mesos ${mesos.library.version} - - net.sf.jasperreports - jasperreports - ${jasperreports.version} - - - commons-logging - commons-logging - - - org.hsqldb hsqldb @@ -133,14 +112,11 @@ 3.0.8 4.8.153 7.20.0.Final - 4.7.0 3.24ea1 4.4.0 2.7.8 1.11.0 - 1.1.0 4.3.1 - 6.20.0 5.3.25 2.7.1 diff --git a/libraries-3/README.md b/libraries-3/README.md index 99b1b60a0a..faef721a22 100644 --- a/libraries-3/README.md +++ b/libraries-3/README.md @@ -8,9 +8,7 @@ The code examples related to different libraries are each in their own module. Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases. ### Relevant Articles: -- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters) - [Guide to the Cactoos Library](https://www.baeldung.com/java-cactoos) -- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline) - [Introduction to cache2k](https://www.baeldung.com/java-cache2k) - [Introduction to the jcabi-aspects AOP Annotations Library](https://www.baeldung.com/java-jcabi-aspects) - [Introduction to Takes](https://www.baeldung.com/java-takes) diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml index 9923e46267..bff0a654c6 100644 --- a/libraries-3/pom.xml +++ b/libraries-3/pom.xml @@ -13,21 +13,11 @@ - - com.beust - jcommander - ${jcommander.version} - org.projectlombok lombok ${lombok.version} - - com.github.rvesse - airline - ${airline.version} - org.cactoos cactoos @@ -125,7 +115,7 @@ javax.annotation javax.annotation-api - 1.3.2 + ${javax.annotation-api.version} @@ -159,10 +149,6 @@ org.apache.maven.plugins maven-compiler-plugin - - 11 - 11 - @@ -214,9 +200,7 @@ - 1.78 0.43 - 2.7.2 1.2.3.Final 0.22.6 1.9.20.1 @@ -233,6 +217,7 @@ 1.0.0 2.5.6 0.9.6 + 1.3.2 \ No newline at end of file diff --git a/libraries-4/README.md b/libraries-4/README.md index 0dee9f1c1e..102f17acdb 100644 --- a/libraries-4/README.md +++ b/libraries-4/README.md @@ -11,9 +11,7 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss) - [Introduction to PCollections](https://www.baeldung.com/java-pcollections) - [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections) -- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by) - [Introduction to NoException](https://www.baeldung.com/no-exception) -- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg) - [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory) - [Guide to JDeferred](https://www.baeldung.com/jdeferred) - [Introduction to MBassador](https://www.baeldung.com/mbassador) diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml index 3949d50875..6b818be9c2 100644 --- a/libraries-4/pom.xml +++ b/libraries-4/pom.xml @@ -22,17 +22,6 @@ eclipse-collections ${eclipse-collections.version} - - com.haulmont.yarg - yarg - ${yarg.version} - - - org.olap4j - olap4j - - - org.olap4j olap4j @@ -68,11 +57,6 @@ servlet-api ${javax.servlet.version} - - io.vavr - vavr - ${vavr.version} - org.pcollections pcollections @@ -119,21 +103,33 @@ jackson-annotations ${jackson-annotations.version} + + io.vavr + vavr + ${vavr.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-io + commons-io + ${commons-io.version} + 2.14.2 2.14.2 1.2.6 - 8.2.0 1.1.0 - 2.0.12 1.3.1 1.0 4.3.8.RELEASE 2.5 3.2.0-m7 - 0.9.0 2.1.2 3.0.0 0.6.5 @@ -142,6 +138,8 @@ 1.2.0 19 10.3.0 + 8.2.0 + 0.9.0 \ No newline at end of file diff --git a/libraries-5/README.md b/libraries-5/README.md index f1e749b293..50fb70bd05 100644 --- a/libraries-5/README.md +++ b/libraries-5/README.md @@ -9,10 +9,8 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### Relevant articles - [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine) -- [Introduction to StreamEx](https://www.baeldung.com/streamex) - [A Docker Guide for Java](https://www.baeldung.com/docker-java-api) - [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java) -- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy) - [Introduction to jOOL](https://www.baeldung.com/jool) - [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts) - [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue) diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml index a043b4bfa8..85f8896890 100644 --- a/libraries-5/pom.xml +++ b/libraries-5/pom.xml @@ -49,21 +49,6 @@ ${typesafe-akka.version} test - - one.util - streamex - ${streamex.version} - - - net.bytebuddy - byte-buddy - ${byte-buddy.version} - - - net.bytebuddy - byte-buddy-agent - ${byte-buddy.version} - com.github.docker-java @@ -139,7 +124,6 @@ 4.3.8.RELEASE 2.12 2.5.11 - 0.8.1 3.0.14 3.1.8 3.0.2 diff --git a/libraries-6/README.md b/libraries-6/README.md index bbebcbc1e0..4236a65d95 100644 --- a/libraries-6/README.md +++ b/libraries-6/README.md @@ -12,7 +12,6 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m - [Guide to Resilience4j](https://www.baeldung.com/resilience4j) - [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client) - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library) -- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) - [Guide to Simple Binary Encoding](https://www.baeldung.com/java-sbe) - [Java-R Integration](https://www.baeldung.com/java-r-integration) - [Using libphonenumber to Validate Phone Numbers](https://www.baeldung.com/java-libphonenumber) diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml index f073ca424c..372c5b1cc7 100644 --- a/libraries-6/pom.xml +++ b/libraries-6/pom.xml @@ -17,11 +17,6 @@ functionaljava-java8 ${functionaljava.version} - - com.codepoetics - protonpack - ${protonpack.version} - io.github.resilience4j resilience4j-circuitbreaker @@ -198,7 +193,6 @@ 2.7.1 4.8.1 2.1.0 - 1.15 3.6 3.5-beta72 3.0 diff --git a/libraries-bytecode/.gitignore b/libraries-bytecode/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-bytecode/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-bytecode/README.md b/libraries-bytecode/README.md new file mode 100644 index 0000000000..cc30511ad1 --- /dev/null +++ b/libraries-bytecode/README.md @@ -0,0 +1,9 @@ +## Server + +This module contains articles about bytecode libraries. + +### Relevant Articles: + +- [Introduction to Javassist](https://www.baeldung.com/javassist) +- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy) +- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm) \ No newline at end of file diff --git a/libraries-bytecode/pom.xml b/libraries-bytecode/pom.xml new file mode 100644 index 0000000000..f21911d77e --- /dev/null +++ b/libraries-bytecode/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + libraries-bytecode + 0.0.1-SNAPSHOT + libraries-bytecode + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.javassist + javassist + ${javaassist.version} + + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + + + net.bytebuddy + byte-buddy-agent + ${byte-buddy.version} + + + org.ow2.asm + asm + ${asm.version} + + + org.ow2.asm + asm-util + ${asm.version} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED + --add-exports=java.base/sun.nio.ch=ALL-UNNAMED + --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED + --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac=ALL-UNNAMED + --add-opens=java.base/java.lang=ALL-UNNAMED + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + --add-opens=java.base/java.io=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + + com.baeldung.examples.asm.instrumentation.Premain + + + + + + + + + + 3.29.2-GA + 5.2 + + + \ No newline at end of file diff --git a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java similarity index 96% rename from asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java rename to libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java index d41a1a16a3..f05a753320 100644 --- a/asm/src/main/java/com/baeldung/examples/asm/CustomClassWriter.java +++ b/libraries-bytecode/src/main/java/com/baeldung/asm/CustomClassWriter.java @@ -1,160 +1,160 @@ -package com.baeldung.examples.asm; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.MethodVisitor; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ACC_STATIC; -import static org.objectweb.asm.Opcodes.ASM4; -import static org.objectweb.asm.Opcodes.V1_5; -import org.objectweb.asm.Type; -import org.objectweb.asm.util.TraceClassVisitor; - -/** - * - * @author baeldung - * @param - */ -public class CustomClassWriter { - - ClassReader reader; - ClassWriter writer; - AddFieldAdapter addFieldAdapter; - AddInterfaceAdapter addInterfaceAdapter; - PublicizeMethodAdapter pubMethAdapter; - final static String CLASSNAME = "java.lang.Integer"; - final static String CLONEABLE = "java/lang/Cloneable"; - - public CustomClassWriter() { - - try { - reader = new ClassReader(CLASSNAME); - writer = new ClassWriter(reader, 0); - - } catch (IOException ex) { - Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public CustomClassWriter(byte[] contents) { - reader = new ClassReader(contents); - writer = new ClassWriter(reader, 0); - } - - public static void main(String[] args) { - CustomClassWriter ccw = new CustomClassWriter(); - ccw.publicizeMethod(); - } - - public byte[] addField() { - addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer); - reader.accept(addFieldAdapter, 0); - return writer.toByteArray(); - } - - public byte[] publicizeMethod() { - pubMethAdapter = new PublicizeMethodAdapter(writer); - reader.accept(pubMethAdapter, 0); - return writer.toByteArray(); - } - - public byte[] addInterface() { - addInterfaceAdapter = new AddInterfaceAdapter(writer); - reader.accept(addInterfaceAdapter, 0); - return writer.toByteArray(); - } - - public class AddInterfaceAdapter extends ClassVisitor { - - public AddInterfaceAdapter(ClassVisitor cv) { - super(ASM4, cv); - } - - @Override - public void visit(int version, int access, String name, - String signature, String superName, String[] interfaces) { - String[] holding = new String[interfaces.length + 1]; - holding[holding.length - 1] = CLONEABLE; - System.arraycopy(interfaces, 0, holding, 0, interfaces.length); - - cv.visit(V1_5, access, name, signature, superName, holding); - } - - } - - public class PublicizeMethodAdapter extends ClassVisitor { - - final Logger logger = Logger.getLogger("PublicizeMethodAdapter"); - TraceClassVisitor tracer; - PrintWriter pw = new PrintWriter(System.out); - - public PublicizeMethodAdapter(ClassVisitor cv) { - super(ASM4, cv); - this.cv = cv; - tracer = new TraceClassVisitor(cv, pw); - } - - @Override - public MethodVisitor visitMethod(int access, - String name, - String desc, - String signature, - String[] exceptions) { - - if (name.equals("toUnsignedString0")) { - logger.info("Visiting unsigned method"); - return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions); - } - return tracer.visitMethod(access, name, desc, signature, exceptions); - - } - - public void visitEnd() { - tracer.visitEnd(); - System.out.println(tracer.p.getText()); - } - - } - - public class AddFieldAdapter extends ClassVisitor { - - String fieldName; - int access; - boolean isFieldPresent; - - public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) { - super(ASM4, cv); - this.cv = cv; - this.access = access; - this.fieldName = fieldName; - } - - @Override - public FieldVisitor visitField(int access, String name, String desc, - String signature, Object value) { - if (name.equals(fieldName)) { - isFieldPresent = true; - } - return cv.visitField(access, name, desc, signature, value); - } - - @Override - public void visitEnd() { - if (!isFieldPresent) { - FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null); - if (fv != null) { - fv.visitEnd(); - } - } - cv.visitEnd(); - } - - } - -} +package com.baeldung.asm; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.MethodVisitor; +import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.ACC_STATIC; +import static org.objectweb.asm.Opcodes.ASM4; +import static org.objectweb.asm.Opcodes.V1_5; +import org.objectweb.asm.Type; +import org.objectweb.asm.util.TraceClassVisitor; + +/** + * + * @author baeldung + * @param + */ +public class CustomClassWriter { + + ClassReader reader; + ClassWriter writer; + AddFieldAdapter addFieldAdapter; + AddInterfaceAdapter addInterfaceAdapter; + PublicizeMethodAdapter pubMethAdapter; + final static String CLASSNAME = "java.lang.Integer"; + final static String CLONEABLE = "java/lang/Cloneable"; + + public CustomClassWriter() { + + try { + reader = new ClassReader(CLASSNAME); + writer = new ClassWriter(reader, 0); + + } catch (IOException ex) { + Logger.getLogger(CustomClassWriter.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public CustomClassWriter(byte[] contents) { + reader = new ClassReader(contents); + writer = new ClassWriter(reader, 0); + } + + public static void main(String[] args) { + CustomClassWriter ccw = new CustomClassWriter(); + ccw.publicizeMethod(); + } + + public byte[] addField() { + addFieldAdapter = new AddFieldAdapter("aNewBooleanField", org.objectweb.asm.Opcodes.ACC_PUBLIC, writer); + reader.accept(addFieldAdapter, 0); + return writer.toByteArray(); + } + + public byte[] publicizeMethod() { + pubMethAdapter = new PublicizeMethodAdapter(writer); + reader.accept(pubMethAdapter, 0); + return writer.toByteArray(); + } + + public byte[] addInterface() { + addInterfaceAdapter = new AddInterfaceAdapter(writer); + reader.accept(addInterfaceAdapter, 0); + return writer.toByteArray(); + } + + public class AddInterfaceAdapter extends ClassVisitor { + + public AddInterfaceAdapter(ClassVisitor cv) { + super(ASM4, cv); + } + + @Override + public void visit(int version, int access, String name, + String signature, String superName, String[] interfaces) { + String[] holding = new String[interfaces.length + 1]; + holding[holding.length - 1] = CLONEABLE; + System.arraycopy(interfaces, 0, holding, 0, interfaces.length); + + cv.visit(V1_5, access, name, signature, superName, holding); + } + + } + + public class PublicizeMethodAdapter extends ClassVisitor { + + final Logger logger = Logger.getLogger("PublicizeMethodAdapter"); + TraceClassVisitor tracer; + PrintWriter pw = new PrintWriter(System.out); + + public PublicizeMethodAdapter(ClassVisitor cv) { + super(ASM4, cv); + this.cv = cv; + tracer = new TraceClassVisitor(cv, pw); + } + + @Override + public MethodVisitor visitMethod(int access, + String name, + String desc, + String signature, + String[] exceptions) { + + if (name.equals("toUnsignedString0")) { + logger.info("Visiting unsigned method"); + return tracer.visitMethod(ACC_PUBLIC + ACC_STATIC, name, desc, signature, exceptions); + } + return tracer.visitMethod(access, name, desc, signature, exceptions); + + } + + public void visitEnd() { + tracer.visitEnd(); + System.out.println(tracer.p.getText()); + } + + } + + public class AddFieldAdapter extends ClassVisitor { + + String fieldName; + int access; + boolean isFieldPresent; + + public AddFieldAdapter(String fieldName, int access, ClassVisitor cv) { + super(ASM4, cv); + this.cv = cv; + this.access = access; + this.fieldName = fieldName; + } + + @Override + public FieldVisitor visitField(int access, String name, String desc, + String signature, Object value) { + if (name.equals(fieldName)) { + isFieldPresent = true; + } + return cv.visitField(access, name, desc, signature, value); + } + + @Override + public void visitEnd() { + if (!isFieldPresent) { + FieldVisitor fv = cv.visitField(access, fieldName, Type.BOOLEAN_TYPE.toString(), null, null); + if (fv != null) { + fv.visitEnd(); + } + } + cv.visitEnd(); + } + + } + +} diff --git a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java similarity index 88% rename from asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java rename to libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java index a3e69b6785..502137bd3d 100644 --- a/asm/src/main/java/com/baeldung/examples/asm/instrumentation/Premain.java +++ b/libraries-bytecode/src/main/java/com/baeldung/asm/instrumentation/Premain.java @@ -1,6 +1,6 @@ -package com.baeldung.examples.asm.instrumentation; +package com.baeldung.asm.instrumentation; -import com.baeldung.examples.asm.CustomClassWriter; +import com.baeldung.asm.CustomClassWriter; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Bar.java rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Bar.java diff --git a/libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/bytebuddy/Foo.java rename to libraries-bytecode/src/main/java/com/baeldung/bytebuddy/Foo.java diff --git a/libraries/src/main/java/com/baeldung/javasisst/Point.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java similarity index 100% rename from libraries/src/main/java/com/baeldung/javasisst/Point.java rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/Point.java diff --git a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java b/libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java similarity index 100% rename from libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java rename to libraries-bytecode/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java diff --git a/asm/src/main/resources/logback.xml b/libraries-bytecode/src/main/resources/logback.xml similarity index 100% rename from asm/src/main/resources/logback.xml rename to libraries-bytecode/src/main/resources/logback.xml diff --git a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java similarity index 93% rename from libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java rename to libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java index 5f721025c3..398e873223 100644 --- a/libraries-5/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java +++ b/libraries-bytecode/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java @@ -1,5 +1,16 @@ package com.baeldung.bytebuddy; +import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +import org.junit.Test; + import net.bytebuddy.ByteBuddy; import net.bytebuddy.agent.ByteBuddyAgent; import net.bytebuddy.dynamic.DynamicType; @@ -8,14 +19,6 @@ import net.bytebuddy.dynamic.loading.ClassReloadingStrategy; import net.bytebuddy.implementation.FixedValue; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.matcher.ElementMatchers; -import org.junit.Test; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; - -import static net.bytebuddy.matcher.ElementMatchers.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; public class ByteBuddyUnitTest { diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java b/libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java rename to libraries-bytecode/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java diff --git a/libraries-cli/.gitignore b/libraries-cli/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-cli/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-cli/README.md b/libraries-cli/README.md new file mode 100644 index 0000000000..b31bb2853d --- /dev/null +++ b/libraries-cli/README.md @@ -0,0 +1,9 @@ +## Server + +This module contains articles about cli libraries. + +### Relevant Articles: + +- [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program) +- [Parsing Command-Line Parameters with JCommander](https://www.baeldung.com/jcommander-parsing-command-line-parameters) +- [Parsing Command-Line Parameters with Airline](https://www.baeldung.com/java-airline) \ No newline at end of file diff --git a/libraries-cli/pom.xml b/libraries-cli/pom.xml new file mode 100644 index 0000000000..d204f3c735 --- /dev/null +++ b/libraries-cli/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + libraries-cli + 0.0.1-SNAPSHOT + libraries-cli + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + ${spring-boot-starter.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + info.picocli + picocli + ${picocli.version} + + + com.beust + jcommander + ${jcommander.version} + + + com.github.rvesse + airline + ${airline.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + + + + 4.7.0 + 1.78 + 2.7.2 + 2.7.8 + 5.3.25 + + + \ No newline at end of file diff --git a/libraries-3/src/main/java/com/baeldung/airline/CommandLine.java b/libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/CommandLine.java rename to libraries-cli/src/main/java/com/baeldung/airline/CommandLine.java diff --git a/libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java rename to libraries-cli/src/main/java/com/baeldung/airline/DatabaseSetupCommand.java diff --git a/libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java b/libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/airline/LoggingCommand.java rename to libraries-cli/src/main/java/com/baeldung/airline/LoggingCommand.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/helloworld/HelloWorldApp.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/UsageBasedBillingApp.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java similarity index 99% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java index ea6b18af53..a28066ac3d 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommand.java @@ -1,5 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli; +import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.FETCH_CMD; +import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault; + +import java.util.List; + import com.baeldung.jcommander.usagebilling.cli.splitter.ColonParameterSplitter; import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator; import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; @@ -7,13 +12,9 @@ import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; import com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; + import lombok.Getter; -import java.util.List; - -import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*; -import static com.baeldung.jcommander.usagebilling.service.FetchCurrentChargesService.getDefault; - @Parameters( commandNames = { FETCH_CMD }, commandDescription = "Fetch charges for a customer in the current month, can be itemized or aggregated" diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java similarity index 99% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java index d3516b19d3..5c12ac665c 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommand.java @@ -1,5 +1,11 @@ package com.baeldung.jcommander.usagebilling.cli; +import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.SUBMIT_CMD; +import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault; + +import java.math.BigDecimal; +import java.time.Instant; + import com.baeldung.jcommander.usagebilling.cli.converter.ISO8601TimestampConverter; import com.baeldung.jcommander.usagebilling.cli.validator.UUIDValidator; import com.baeldung.jcommander.usagebilling.model.UsageRequest; @@ -7,14 +13,9 @@ import com.baeldung.jcommander.usagebilling.model.UsageRequest.PricingType; import com.baeldung.jcommander.usagebilling.service.SubmitUsageService; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; + import lombok.Getter; -import java.math.BigDecimal; -import java.time.Instant; - -import static com.baeldung.jcommander.usagebilling.cli.UsageBasedBilling.*; -import static com.baeldung.jcommander.usagebilling.service.SubmitUsageService.getDefault; - @Parameters( commandNames = { SUBMIT_CMD }, commandDescription = "Submit usage for a given customer and subscription, accepts one usage item" diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/UsageBasedBilling.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java index e54865a811..c173f62684 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/converter/ISO8601TimestampConverter.java @@ -1,7 +1,6 @@ package com.baeldung.jcommander.usagebilling.cli.converter; -import com.beust.jcommander.ParameterException; -import com.beust.jcommander.converters.BaseConverter; +import static java.lang.String.format; import java.time.Instant; import java.time.LocalDateTime; @@ -9,7 +8,8 @@ import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import static java.lang.String.format; +import com.beust.jcommander.ParameterException; +import com.beust.jcommander.converters.BaseConverter; public class ISO8601TimestampConverter extends BaseConverter { diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java index f24c028123..1e73b54045 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/splitter/ColonParameterSplitter.java @@ -1,10 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli.splitter; -import com.beust.jcommander.converters.IParameterSplitter; +import static java.util.Arrays.asList; import java.util.List; -import static java.util.Arrays.asList; +import com.beust.jcommander.converters.IParameterSplitter; public class ColonParameterSplitter implements IParameterSplitter { diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java index a72912f7d0..f8d9f81203 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/cli/validator/UUIDValidator.java @@ -1,10 +1,10 @@ package com.baeldung.jcommander.usagebilling.cli.validator; +import java.util.regex.Pattern; + import com.beust.jcommander.IParameterValidator; import com.beust.jcommander.ParameterException; -import java.util.regex.Pattern; - public class UUIDValidator implements IParameterValidator { private static final String UUID_REGEX = diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java similarity index 70% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java index 93dd7a5732..c57805b784 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesRequest.java @@ -1,9 +1,13 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java similarity index 91% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java index 865a6e4a3d..46fb86ba78 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/CurrentChargesResponse.java @@ -1,11 +1,15 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java similarity index 89% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java index 2785474acf..07da8ee4b5 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/model/UsageRequest.java @@ -1,10 +1,14 @@ package com.baeldung.jcommander.usagebilling.model; -import lombok.*; - import java.math.BigDecimal; import java.time.Instant; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + @NoArgsConstructor(access = AccessLevel.PACKAGE) @AllArgsConstructor(access = AccessLevel.PACKAGE) @Builder diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java index 6436d49875..e1c5e25856 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultFetchCurrentChargesService.java @@ -1,13 +1,5 @@ package com.baeldung.jcommander.usagebilling.service; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; -import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem; - -import java.math.BigDecimal; -import java.util.List; -import java.util.UUID; - import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Arrays.fill; @@ -15,6 +7,14 @@ import static java.util.Collections.emptyList; import static java.util.concurrent.ThreadLocalRandom.current; import static java.util.stream.Collectors.toList; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +import com.baeldung.jcommander.usagebilling.model.CurrentChargesRequest; +import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse; +import com.baeldung.jcommander.usagebilling.model.CurrentChargesResponse.LineItem; + class DefaultFetchCurrentChargesService implements FetchCurrentChargesService { @Override diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java index 44ac9e9ed7..fb214c9ab9 100644 --- a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java +++ b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/DefaultSubmitUsageService.java @@ -1,9 +1,9 @@ package com.baeldung.jcommander.usagebilling.service; -import com.baeldung.jcommander.usagebilling.model.UsageRequest; - import java.util.UUID; +import com.baeldung.jcommander.usagebilling.model.UsageRequest; + class DefaultSubmitUsageService implements SubmitUsageService { @Override diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/FetchCurrentChargesService.java diff --git a/libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java b/libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java similarity index 100% rename from libraries-3/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java rename to libraries-cli/src/main/java/com/baeldung/jcommander/usagebilling/service/SubmitUsageService.java diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/Application.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java index 04af524e45..80c132d637 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/Application.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/Application.java @@ -1,13 +1,15 @@ package com.baeldung.picocli.git; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + import com.baeldung.picocli.git.commands.programmative.GitCommand; import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; + import picocli.CommandLine; @SpringBootApplication diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java index f3c690a3e6..fbd7907eb8 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/declarative/GitCommand.java @@ -1,14 +1,15 @@ package com.baeldung.picocli.git.commands.declarative; -import com.baeldung.picocli.git.model.ConfigElement; -import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; -import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; -import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; -import picocli.CommandLine; - import static picocli.CommandLine.*; import static picocli.CommandLine.Command; +import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; +import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; +import com.baeldung.picocli.git.commands.subcommands.GitConfigCommand; +import com.baeldung.picocli.git.model.ConfigElement; + +import picocli.CommandLine; + @Command( name = "git", subcommands = { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java index 2c3e440b8b..74993a50fe 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/methods/GitCommand.java @@ -1,9 +1,9 @@ package com.baeldung.picocli.git.commands.methods; -import picocli.CommandLine; - import static picocli.CommandLine.Command; +import picocli.CommandLine; + @Command(name = "git") public class GitCommand implements Runnable { public static void main(String[] args) { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java index 81ecfd78be..fabd0e4cc7 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/programmative/GitCommand.java @@ -1,13 +1,15 @@ package com.baeldung.picocli.git.commands.programmative; -import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; -import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; -import org.springframework.stereotype.Component; -import picocli.CommandLine; - import static picocli.CommandLine.Command; import static picocli.CommandLine.RunLast; +import org.springframework.stereotype.Component; + +import com.baeldung.picocli.git.commands.subcommands.GitAddCommand; +import com.baeldung.picocli.git.commands.subcommands.GitCommitCommand; + +import picocli.CommandLine; + @Command(name = "git") @Component public class GitCommand implements Runnable { diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java index 803cd8dc7d..f87e55a5cc 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitAddCommand.java @@ -1,11 +1,11 @@ package com.baeldung.picocli.git.commands.subcommands; -import org.springframework.stereotype.Component; +import static picocli.CommandLine.*; import java.nio.file.Path; import java.util.List; -import static picocli.CommandLine.*; +import org.springframework.stereotype.Component; @Command( name = "add" diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java index df4928983c..f2136f9c39 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitCommitCommand.java @@ -1,10 +1,10 @@ package com.baeldung.picocli.git.commands.subcommands; -import org.springframework.stereotype.Component; - import static picocli.CommandLine.Command; import static picocli.CommandLine.Option; +import org.springframework.stereotype.Component; + @Command( name = "commit" ) diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java similarity index 99% rename from libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java index 80e14c0121..6ba803140a 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/git/commands/subcommands/GitConfigCommand.java @@ -1,11 +1,12 @@ package com.baeldung.picocli.git.commands.subcommands; -import com.baeldung.picocli.git.model.ConfigElement; -import org.springframework.stereotype.Component; - import static picocli.CommandLine.Command; import static picocli.CommandLine.Parameters; +import org.springframework.stereotype.Component; + +import com.baeldung.picocli.git.model.ConfigElement; + @Command( name = "config" ) diff --git a/libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java b/libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java rename to libraries-cli/src/main/java/com/baeldung/picocli/git/model/ConfigElement.java diff --git a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java rename to libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java index 97a861e2f0..2df8ac0a5b 100644 --- a/libraries-2/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java +++ b/libraries-cli/src/main/java/com/baeldung/picocli/helloworld/HelloWorldCommand.java @@ -1,9 +1,9 @@ package com.baeldung.picocli.helloworld; -import picocli.CommandLine; - import static picocli.CommandLine.Command; +import picocli.CommandLine; + @Command( name = "hello", description = "Says hello" diff --git a/libraries-cli/src/main/resources/logback.xml b/libraries-cli/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-cli/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java similarity index 99% rename from libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java index 48b3ac2896..c73e8e9d48 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/helloworld/HelloWorldAppUnitTest.java @@ -1,9 +1,10 @@ package com.baeldung.jcommander.helloworld; -import com.beust.jcommander.JCommander; +import static org.junit.Assert.assertEquals; + import org.junit.Test; -import static org.junit.Assert.assertEquals; +import com.beust.jcommander.JCommander; public class HelloWorldAppUnitTest { diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java similarity index 99% rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java index b639661c39..aba4585f6e 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/FetchCurrentChargesCommandUnitTest.java @@ -1,11 +1,12 @@ package com.baeldung.jcommander.usagebilling.cli; -import com.beust.jcommander.JCommander; -import org.junit.Test; - import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertThat; +import org.junit.Test; + +import com.beust.jcommander.JCommander; + public class FetchCurrentChargesCommandUnitTest { private JCommander jc = JCommander.newBuilder() diff --git a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java similarity index 95% rename from libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java rename to libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java index d6ce132053..a4d8273638 100644 --- a/libraries-3/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java +++ b/libraries-cli/src/test/java/com/baeldung/jcommander/usagebilling/cli/SubmitUsageCommandUnitTest.java @@ -1,12 +1,11 @@ package com.baeldung.jcommander.usagebilling.cli; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Test; + import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; public class SubmitUsageCommandUnitTest { diff --git a/libraries-reporting/.gitignore b/libraries-reporting/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-reporting/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-reporting/README.md b/libraries-reporting/README.md new file mode 100644 index 0000000000..6d405911ab --- /dev/null +++ b/libraries-reporting/README.md @@ -0,0 +1,8 @@ +## Server + +This module contains articles about reporting libraries. + +### Relevant Articles: + +- [JasperReports with Spring](https://www.baeldung.com/spring-jasper) +- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg) \ No newline at end of file diff --git a/libraries-reporting/pom.xml b/libraries-reporting/pom.xml new file mode 100644 index 0000000000..526f187af8 --- /dev/null +++ b/libraries-reporting/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + libraries-reporting + 0.0.1-SNAPSHOT + libraries-reporting + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + ${spring-boot-starter.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + javax.servlet + servlet-api + ${javax.servlet.version} + + + net.sf.jasperreports + jasperreports + ${jasperreports.version} + + + commons-logging + commons-logging + + + + + com.haulmont.yarg + yarg + ${yarg.version} + + + org.olap4j + olap4j + + + + + + + 2.7.8 + 5.3.25 + 2.5 + 6.20.0 + 2.0.12 + + + \ No newline at end of file diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/Main.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/Main.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/Main.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java diff --git a/libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java b/libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java similarity index 100% rename from libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java rename to libraries-reporting/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java diff --git a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java similarity index 99% rename from libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java rename to libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java index ff0d452108..9ae9b61ad1 100644 --- a/libraries-4/src/main/java/com/baeldung/yarg/DocumentController.java +++ b/libraries-reporting/src/main/java/com/baeldung/yarg/DocumentController.java @@ -5,6 +5,16 @@ */ package com.baeldung.yarg; +import java.io.File; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + import com.haulmont.yarg.formatters.factory.DefaultFormatterFactory; import com.haulmont.yarg.loaders.factory.DefaultLoaderFactory; import com.haulmont.yarg.loaders.impl.JsonDataLoader; @@ -16,13 +26,6 @@ import com.haulmont.yarg.structure.ReportOutputType; import com.haulmont.yarg.structure.impl.BandBuilder; import com.haulmont.yarg.structure.impl.ReportBuilder; import com.haulmont.yarg.structure.impl.ReportTemplateBuilder; -import java.io.File; -import java.io.IOException; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.io.FileUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; @RestController public class DocumentController { diff --git a/libraries-2/src/main/resources/employee-schema.sql b/libraries-reporting/src/main/resources/employee-schema.sql similarity index 100% rename from libraries-2/src/main/resources/employee-schema.sql rename to libraries-reporting/src/main/resources/employee-schema.sql diff --git a/libraries-2/src/main/resources/employeeEmailReport.jrxml b/libraries-reporting/src/main/resources/employeeEmailReport.jrxml similarity index 100% rename from libraries-2/src/main/resources/employeeEmailReport.jrxml rename to libraries-reporting/src/main/resources/employeeEmailReport.jrxml diff --git a/libraries-2/src/main/resources/employeeReport.jrxml b/libraries-reporting/src/main/resources/employeeReport.jrxml similarity index 100% rename from libraries-2/src/main/resources/employeeReport.jrxml rename to libraries-reporting/src/main/resources/employeeReport.jrxml diff --git a/libraries-reporting/src/main/resources/logback.xml b/libraries-reporting/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-reporting/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-stream/.gitignore b/libraries-stream/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-stream/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-stream/README.md b/libraries-stream/README.md new file mode 100644 index 0000000000..6aa5a28cd9 --- /dev/null +++ b/libraries-stream/README.md @@ -0,0 +1,11 @@ +## Server + +This module contains articles about stream libraries. + +### Relevant Articles: + +- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams) +- [Guide to Java Parallel Collectors Library](https://www.baeldung.com/java-parallel-collectors) +- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by) +- [Introduction to StreamEx](https://www.baeldung.com/streamex) +- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) \ No newline at end of file diff --git a/libraries-stream/pom.xml b/libraries-stream/pom.xml new file mode 100644 index 0000000000..8f00be3dab --- /dev/null +++ b/libraries-stream/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + libraries-stream + 0.0.1-SNAPSHOT + libraries-stream + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.jooq + jool + ${jool.version} + + + com.pivovarit + parallel-collectors + ${parallel-collectors.version} + + + io.vavr + vavr + ${vavr.version} + + + org.eclipse.collections + eclipse-collections + ${eclipse-collections.version} + + + one.util + streamex + ${streamex.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + + + 0.9.12 + 1.1.0 + 0.9.0 + 8.2.0 + 0.8.1 + 1.15 + + + \ No newline at end of file diff --git a/libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java b/libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java rename to libraries-stream/src/main/java/com/baeldung/distinct/DistinctWithJavaFunction.java diff --git a/libraries-4/src/main/java/com/baeldung/distinct/Person.java b/libraries-stream/src/main/java/com/baeldung/distinct/Person.java similarity index 100% rename from libraries-4/src/main/java/com/baeldung/distinct/Person.java rename to libraries-stream/src/main/java/com/baeldung/distinct/Person.java diff --git a/libraries-5/src/main/java/com/baeldung/streamex/Role.java b/libraries-stream/src/main/java/com/baeldung/streamex/Role.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/streamex/Role.java rename to libraries-stream/src/main/java/com/baeldung/streamex/Role.java diff --git a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java similarity index 99% rename from libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java rename to libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java index 56a3860f05..989b65bef6 100644 --- a/libraries-5/src/main/java/com/baeldung/streamex/StreamEX.java +++ b/libraries-stream/src/main/java/com/baeldung/streamex/StreamEX.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; + import one.util.streamex.DoubleStreamEx; import one.util.streamex.EntryStream; import one.util.streamex.IntStreamEx; diff --git a/libraries-5/src/main/java/com/baeldung/streamex/User.java b/libraries-stream/src/main/java/com/baeldung/streamex/User.java similarity index 100% rename from libraries-5/src/main/java/com/baeldung/streamex/User.java rename to libraries-stream/src/main/java/com/baeldung/streamex/User.java diff --git a/libraries-stream/src/main/resources/logback.xml b/libraries-stream/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-stream/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithEclipseCollectionsUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java index 936fd3e839..196c6603dd 100644 --- a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.distinct; -import static org.junit.Assert.assertTrue; import static com.baeldung.distinct.DistinctWithJavaFunction.distinctByKey; +import static org.junit.Assert.assertTrue; import java.util.List; import java.util.stream.Collectors; diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java diff --git a/libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java b/libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java similarity index 100% rename from libraries-4/src/test/java/com/baeldung/distinct/PersonDataGenerator.java rename to libraries-stream/src/test/java/com/baeldung/distinct/PersonDataGenerator.java diff --git a/libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java similarity index 100% rename from libraries-2/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/parallel_collectors/ParallelCollectorsUnitTest.java diff --git a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java similarity index 99% rename from libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java index c28248e52c..ed5fec254d 100644 --- a/libraries-6/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/protonpack/ProtonpackUnitTest.java @@ -1,11 +1,9 @@ package com.baeldung.protonpack; -import com.codepoetics.protonpack.Indexed; -import com.codepoetics.protonpack.StreamUtils; -import com.codepoetics.protonpack.collectors.CollectorUtils; -import com.codepoetics.protonpack.collectors.NonUniqueValueException; -import com.codepoetics.protonpack.selectors.Selectors; -import org.junit.Test; +import static java.util.Arrays.asList; +import static java.util.Arrays.stream; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.util.List; import java.util.Optional; @@ -13,10 +11,13 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.util.Arrays.asList; -import static java.util.Arrays.stream; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import org.junit.Test; + +import com.codepoetics.protonpack.Indexed; +import com.codepoetics.protonpack.StreamUtils; +import com.codepoetics.protonpack.collectors.CollectorUtils; +import com.codepoetics.protonpack.collectors.NonUniqueValueException; +import com.codepoetics.protonpack.selectors.Selectors; public class ProtonpackUnitTest { @Test diff --git a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/stream/JoolMergeStreamsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/stream/MergeStreamsUnitTest.java diff --git a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java similarity index 99% rename from libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java rename to libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java index b267eaea9b..de474b825c 100644 --- a/libraries-5/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java +++ b/libraries-stream/src/test/java/com/baeldung/streamex/StreamExMergeStreamsUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.streamex; -import one.util.streamex.StreamEx; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import one.util.streamex.StreamEx; public class StreamExMergeStreamsUnitTest { diff --git a/libraries/README.md b/libraries/README.md index 33c40ea67c..a8aa34973b 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -10,9 +10,7 @@ Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-m ### Relevant articles - [Introduction to Javatuples](https://www.baeldung.com/java-tuples) -- [Introduction to Javassist](https://www.baeldung.com/javassist) - [Intro to JaVers](https://www.baeldung.com/javers) -- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams) - [Introduction to Quartz](https://www.baeldung.com/quartz) - [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup) - [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm) diff --git a/libraries/pom.xml b/libraries/pom.xml index 07a4853728..756f455f4b 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -40,11 +40,6 @@ javatuples ${javatuples.version} - - org.javassist - javassist - ${javaassist.version} - org.javers javers-core @@ -120,11 +115,6 @@ quartz ${quartz.version} - - org.jooq - jool - ${jool.version} - org.openjdk.jmh jmh-core @@ -289,8 +279,6 @@ 4.3.8.RELEASE 3.0.3 2.3.0 - 3.29.2-GA - 0.9.12 3.6 2.6 diff --git a/pom.xml b/pom.xml index 0e8acff1d1..48da93fea4 100644 --- a/pom.xml +++ b/pom.xml @@ -709,7 +709,6 @@ apache-tika apache-velocity asciidoctor - asm atomix aws-modules azure @@ -777,6 +776,8 @@ libraries-apache-commons-collections libraries-apache-commons-io libraries-apache-commons + libraries-bytecode + libraries-cli libraries-concurrency libraries-data-2 libraries-data-db @@ -788,10 +789,12 @@ libraries-io libraries-llms libraries-primitive + libraries-reporting libraries-rpc libraries-security libraries-server-2 libraries-server + libraries-stream libraries-testing libraries-transform libraries @@ -956,7 +959,6 @@ apache-tika apache-velocity asciidoctor - asm atomix aws-modules azure @@ -1024,6 +1026,8 @@ libraries-apache-commons-collections libraries-apache-commons-io libraries-apache-commons + libraries-bytecode + libraries-cli libraries-concurrency libraries-data-2 libraries-data-db @@ -1035,10 +1039,12 @@ libraries-io libraries-llms libraries-primitive + libraries-reporting libraries-rpc libraries-security libraries-server-2 libraries-server + libraries-stream libraries-testing libraries-transform libraries From 9f7ec43036959e659ac17897426f38b3ac90de94 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 12:41:51 +0200 Subject: [PATCH 823/831] [JAVA-27822] Upgrade ddd to Spring Boot 3 (#15399) --- patterns-modules/ddd/pom.xml | 25 ++++--------------- .../com/baeldung/ddd/order/jpa/JpaOrder.java | 12 ++++----- .../baeldung/ddd/order/jpa/JpaOrderLine.java | 4 +-- .../baeldung/ddd/order/jpa/JpaProduct.java | 2 +- .../request/AddProductRequest.java | 2 +- .../request/CreateOrderRequest.java | 2 +- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/patterns-modules/ddd/pom.xml b/patterns-modules/ddd/pom.xml index 80147c29c6..1eb1f90741 100644 --- a/patterns-modules/ddd/pom.xml +++ b/patterns-modules/ddd/pom.xml @@ -10,29 +10,11 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 - - - - org.junit - junit-bom - ${junit-jupiter.version} - pom - import - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - @@ -88,12 +70,15 @@ de.flapdoodle.embed de.flapdoodle.embed.mongo + ${de.flapdoodle.embed.mongo.version} test + com.baeldung.ddd.PersistingDddAggregatesApplication 1.0.1 + 4.11.1 \ No newline at end of file diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java index 81ae3bbd19..e0e7ea9a4e 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java @@ -4,12 +4,12 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "order_table") diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java index a3b50f0502..bf1d7020be 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrderLine.java @@ -1,7 +1,7 @@ package com.baeldung.ddd.order.jpa; -import javax.persistence.Embeddable; -import javax.persistence.Embedded; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Embedded; @Embeddable class JpaOrderLine { diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java index 1d2ae5230a..30b074b2e4 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaProduct.java @@ -2,7 +2,7 @@ package com.baeldung.ddd.order.jpa; import java.math.BigDecimal; -import javax.persistence.Embeddable; +import jakarta.persistence.Embeddable; @Embeddable class JpaProduct { diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java index ec107d635b..76dc438b63 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java @@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class AddProductRequest { @NotNull private Product product; diff --git a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java index 8c51fbe479..ff81908811 100644 --- a/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java +++ b/patterns-modules/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java @@ -4,7 +4,7 @@ import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; public class CreateOrderRequest { @NotNull private Product product; From 6e7e41cea4195a0df2325d8bf1b6b9f29ff43fd0 Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Wed, 13 Dec 2023 15:51:01 +0200 Subject: [PATCH 824/831] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 16dfd68349..0be88b1c07 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -29,12 +29,12 @@ public class OutputStreamToByteArrayUnitTest { @Test - public void givenFileOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray(@TempDir Path tempDir) throws IOException { + public void givenByteArrayOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { String data = "Welcome to Baeldung!"; - String fileName = "file.txt"; - Path filePath = tempDir.resolve(fileName); - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(new FileOutputStream(filePath.toFile())); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(byteArrayOutputStream); + try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); } From 62c172f814477018996c44b06d2d8fa246c410fa Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 21:58:43 +0200 Subject: [PATCH 825/831] =?UTF-8?q?[JAVA-27376]=20Moved=20article=20"Progr?= =?UTF-8?q?ammatically=20Restarting=20a=20Spring=20Boot=E2=80=A6=20(#15412?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JAVA-27376] Moved article "Programmatically Restarting a Spring Boot Application" to spring-boot-runtime-2 module * [JAVA-27367] --- spring-boot-modules/spring-boot-runtime-2/README.md | 3 +++ spring-boot-modules/spring-boot-runtime-2/pom.xml | 12 ++++++++++++ .../main/java/com/baeldung/restart/Application.java | 0 .../java/com/baeldung/restart/RestartController.java | 0 .../java/com/baeldung/restart/RestartService.java | 2 +- .../src/main/resources/application.properties | 7 +++++++ .../restart/RestartApplicationManualTest.java | 0 spring-boot-modules/spring-boot-runtime/README.md | 3 ++- 8 files changed, 25 insertions(+), 2 deletions(-) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/Application.java (100%) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/RestartController.java (100%) rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/main/java/com/baeldung/restart/RestartService.java (99%) create mode 100644 spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties rename spring-boot-modules/{spring-boot-runtime => spring-boot-runtime-2}/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java (100%) diff --git a/spring-boot-modules/spring-boot-runtime-2/README.md b/spring-boot-modules/spring-boot-runtime-2/README.md index 3ee05ccc83..c22f7cbc18 100644 --- a/spring-boot-modules/spring-boot-runtime-2/README.md +++ b/spring-boot-modules/spring-boot-runtime-2/README.md @@ -5,3 +5,6 @@ This module contains articles about administering a Spring Boot runtime ### Relevant Articles: - [Configure the Heap Size When Starting a Spring Boot Application](https://www.baeldung.com/spring-boot-heap-size) - [Max-HTTP-Header-Size in Spring Boot 2](https://www.baeldung.com/spring-boot-max-http-header-size) + - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) + + - More articles: [[<-- prev]](../spring-boot-runtime) diff --git a/spring-boot-modules/spring-boot-runtime-2/pom.xml b/spring-boot-modules/spring-boot-runtime-2/pom.xml index 5174900c79..356880975a 100644 --- a/spring-boot-modules/spring-boot-runtime-2/pom.xml +++ b/spring-boot-modules/spring-boot-runtime-2/pom.xml @@ -28,6 +28,15 @@ org.springframework.security spring-security-test + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-starter + ${springcloud.version} + @@ -64,4 +73,7 @@ + + 3.1.3 + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/Application.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartController.java diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java similarity index 99% rename from spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java rename to spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java index 9883ec653b..f197efb067 100644 --- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java +++ b/spring-boot-modules/spring-boot-runtime-2/src/main/java/com/baeldung/restart/RestartService.java @@ -1,8 +1,8 @@ package com.baeldung.restart; -import org.springframework.stereotype.Service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.restart.RestartEndpoint; +import org.springframework.stereotype.Service; @Service public class RestartService { diff --git a/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties new file mode 100644 index 0000000000..f6bd08e5dd --- /dev/null +++ b/spring-boot-modules/spring-boot-runtime-2/src/main/resources/application.properties @@ -0,0 +1,7 @@ +management.endpoints.web.exposure.include=* +management.metrics.enable.root=true +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=true +spring.datasource.jmx-enabled=false +spring.jmx.enabled=true +management.endpoint.shutdown.enabled=true \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java b/spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java similarity index 100% rename from spring-boot-modules/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java rename to spring-boot-modules/spring-boot-runtime-2/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md index 6463aaa6c3..44b217ae77 100644 --- a/spring-boot-modules/spring-boot-runtime/README.md +++ b/spring-boot-modules/spring-boot-runtime/README.md @@ -4,10 +4,11 @@ This module contains articles about administering a Spring Boot runtime ### Relevant Articles: - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) - - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) - [CORS with Spring](https://www.baeldung.com/spring-cors) + + - More articles: [[more -->]](../spring-boot-runtime-2) From 3e8f48d06e482515fe0a0acd12c8cc4e315e7eb1 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Wed, 13 Dec 2023 20:02:49 +0000 Subject: [PATCH 826/831] BAEL-7346: Parse Java Source Code and Extract Methods (#15409) --- .../extractjava/ExtractJavaLiveTest.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java diff --git a/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java new file mode 100644 index 0000000000..02904ad2fc --- /dev/null +++ b/core-java-modules/core-java-sun/src/test/java/com/baeldung/extractjava/ExtractJavaLiveTest.java @@ -0,0 +1,94 @@ +package com.baeldung.extractjava; + +import com.sun.source.tree.ClassTree; +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.MethodTree; +import com.sun.source.tree.Tree; +import com.sun.source.util.JavacTask; +import com.sun.source.util.SimpleTreeVisitor; +import org.junit.Test; + +import javax.tools.JavaCompiler; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +public class ExtractJavaLiveTest { + @Test + public void visitTypeDeclsForClasses() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + tree.accept(new SimpleTreeVisitor() { + @Override + public Object visitClass(ClassTree classTree, Object o) { + System.out.println("Found class: " + classTree.getSimpleName()); + return null; + } + }, null); + } + } + + @Test + public void iterateTypeDeclsForClasses() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + if (tree.getKind() == Tree.Kind.CLASS) { + ClassTree classTree = (ClassTree) tree; + System.out.println("Found class: " + classTree.getSimpleName()); + } + } + } + + @Test + public void visitMethodsForClass() throws Exception { + CompilationUnitTree compilationUnitTree = parseFile(); + + for (Tree tree : compilationUnitTree.getTypeDecls()) { + if (tree.getKind() == Tree.Kind.CLASS) { + ClassTree classTree = (ClassTree) tree; + visitClassMethods(classTree); + } + } + + } + + private void visitClassMethods(ClassTree classTree) { + for (Tree member : classTree.getMembers()) { + member.accept(new SimpleTreeVisitor(){ + @Override + public Object visitMethod(MethodTree methodTree, Object o) { + System.out.println("Found method: " + classTree.getSimpleName() + "." + methodTree.getName()); + System.out.println("Return value: " + methodTree.getReturnType()); + System.out.println("Parameters: " + methodTree.getParameters()); + + for (Tree statement : methodTree.getBody().getStatements()) { + System.out.println("Found statement: " + statement); + } + + return null; + } + }, null); + } + } + + private static CompilationUnitTree parseFile() throws IOException { + String filename = "src/test/java/com/baeldung/extractjava/ExtractJavaUnitTest.java"; + + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + + StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, StandardCharsets.UTF_8); + Iterable compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File(filename))); + + JavacTask javacTask = (JavacTask) compiler.getTask(null, fileManager, null, null, null, compilationUnits); + Iterable compilationUnitTrees = javacTask.parse(); + + CompilationUnitTree compilationUnitTree = compilationUnitTrees.iterator().next(); + return compilationUnitTree; + } +} From cd85eb8b0b82c4bbac0cfcd677a346a3d97ebca8 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Wed, 13 Dec 2023 22:04:35 +0200 Subject: [PATCH 827/831] [JAVA-27620] (#15396) * [JAVA-27620] * [JAVA-27620] * [JAVA-27620] Comment spring-boot-3-2 module --- spring-boot-modules/pom.xml | 2 +- spring-boot-modules/spring-boot-3-2/README.md | 2 ++ spring-boot-modules/spring-boot-3-2/pom.xml | 1 + .../main/java/com/baeldung/restclient/Article.java | 0 .../com/baeldung/restclient/ArticleController.java | 13 ++++++++++--- .../restclient/ArticleNotFoundException.java | 0 .../InvalidArticleResponseException.java | 0 .../baeldung/restclient/RestClientApplication.java | 0 .../restclient/RestClientIntegrationTest.java | 14 +++++++------- spring-boot-modules/spring-boot-3/README.md | 3 ++- 10 files changed, 23 insertions(+), 12 deletions(-) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/Article.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/ArticleController.java (75%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/main/java/com/baeldung/restclient/RestClientApplication.java (100%) rename spring-boot-modules/{spring-boot-3 => spring-boot-3-2}/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java (100%) diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index eaf04cf015..890edd6cc5 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -95,7 +95,7 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-3-testcontainers - spring-boot-3-2 + spring-boot-resilience4j spring-boot-properties spring-boot-properties-2 diff --git a/spring-boot-modules/spring-boot-3-2/README.md b/spring-boot-modules/spring-boot-3-2/README.md index 27f9281725..b461cd9913 100644 --- a/spring-boot-modules/spring-boot-3-2/README.md +++ b/spring-boot-modules/spring-boot-3-2/README.md @@ -1,3 +1,5 @@ ## Relevant Articles - [Spring Boot 3.1’s ConnectionDetails Abstraction](https://www.baeldung.com/spring-boot-3-1-connectiondetails-abstraction) - [@ConditionalOnThreading Annotation Spring](https://www.baeldung.com/spring-conditionalonthreading) +- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient) +- More articles: [[<-- prev]](/spring-boot-modules/spring-boot-3) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3-2/pom.xml b/spring-boot-modules/spring-boot-3-2/pom.xml index e48b232a52..8878060a97 100644 --- a/spring-boot-modules/spring-boot-3-2/pom.xml +++ b/spring-boot-modules/spring-boot-3-2/pom.xml @@ -282,6 +282,7 @@ + com.baeldung.restclient.RestClientApplication 1.6.0.Beta1 2.0.0 3.0.0-M7 diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/Article.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/Article.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java similarity index 75% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java index 5e1dff6fd7..c2d87a558c 100644 --- a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleController.java +++ b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleController.java @@ -1,13 +1,20 @@ package com.baeldung.restclient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + @RestController @RequestMapping("/articles") public class ArticleController { diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/ArticleNotFoundException.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/InvalidArticleResponseException.java diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java b/spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/restclient/RestClientApplication.java rename to spring-boot-modules/spring-boot-3-2/src/main/java/com/baeldung/restclient/RestClientApplication.java diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java rename to spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java index 1a615faf4e..3e12215bcb 100644 --- a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java +++ b/spring-boot-modules/spring-boot-3-2/src/test/java/com/baeldung/restclient/RestClientIntegrationTest.java @@ -1,7 +1,10 @@ package com.baeldung.restclient; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -14,11 +17,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClient; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class RestClientIntegrationTest { diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md index ded5db30e4..ff00a506cf 100644 --- a/spring-boot-modules/spring-boot-3/README.md +++ b/spring-boot-modules/spring-boot-3/README.md @@ -8,4 +8,5 @@ - [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface) - [Working with Virtual Threads in Spring 6](https://www.baeldung.com/spring-6-virtual-threads) - [Docker Compose Support in Spring Boot 3](https://www.baeldung.com/ops/docker-compose-support-spring-boot) -- [A Guide to RestClient in Spring Boot](https://www.baeldung.com/spring-boot-restclient) + +- More articles: [[next -->]](/spring-boot-modules/spring-boot-3-2) From 2495d6fd623bdc992dec84dd14c19a53a807b7f1 Mon Sep 17 00:00:00 2001 From: Oscar Mauricio Forero Carrillo Date: Wed, 13 Dec 2023 21:22:10 +0100 Subject: [PATCH 828/831] BAEL-7226: Code for the improvements of the Percentages article. (#15352) * BAEL-7226: Code for the improvements of the Percentages article. * BAEL-7226: Rename Test to follow the convention --- core-java-modules/core-java-lang-math/pom.xml | 8 ++++++ .../BigDecimalPercentageCalculator.java | 20 ++++++++++++++ .../percentage/BigDecimalPercentages.java | 18 +++++++++++++ .../percentage/FastBigDecimalPercentage.java | 16 +++++++++++ .../BigDecimalPercentageUnitTest.java | 27 +++++++++++++++++++ .../FastBigDecimalPercentageUnitTest.java | 27 +++++++++++++++++++ 6 files changed, 116 insertions(+) create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java create mode 100644 core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java create mode 100644 core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml index 551e5db1d5..a229327415 100644 --- a/core-java-modules/core-java-lang-math/pom.xml +++ b/core-java-modules/core-java-lang-math/pom.xml @@ -5,6 +5,14 @@ 4.0.0 core-java-lang-math core-java-lang-math + + + org.projectlombok + lombok + 1.18.24 + compile + + jar diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java new file mode 100644 index 0000000000..91fde335e9 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.percentage; + +import lombok.experimental.ExtensionMethod; +import java.math.BigDecimal; +import java.util.Scanner; + +@ExtensionMethod(FastBigDecimalPercentage.class) +public class BigDecimalPercentageCalculator { + public static void main(String[] args) { + + Scanner in = new Scanner(System.in); + System.out.println("Enter obtained marks:"); + BigDecimal obtained = new BigDecimal(in.nextDouble()); + System.out.println("Enter total marks:"); + BigDecimal total = new BigDecimal(in.nextDouble()); + + System.out.println("Percentage obtained :"+ obtained.toPercentageOf(total)); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java new file mode 100644 index 0000000000..c91cf0e9d4 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java @@ -0,0 +1,18 @@ +package com.baeldung.algorithms.percentage; + + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalPercentages { + + private static final BigDecimal ONE_HUNDRED = new BigDecimal("100"); + + public BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) { + return value.divide(total, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED); + } + + public BigDecimal percentOf(BigDecimal percentage, BigDecimal total) { + return percentage.multiply(total).divide(ONE_HUNDRED, 2, RoundingMode.HALF_UP); + } +} diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java new file mode 100644 index 0000000000..f00a9f3e35 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms.percentage; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class FastBigDecimalPercentage { + + public static BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) { + return value.divide(total, 4, RoundingMode.HALF_UP).scaleByPowerOfTen(2); + } + + public static BigDecimal percentOf(BigDecimal percentage, BigDecimal total) { + return percentage.multiply(total).scaleByPowerOfTen(-2); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java new file mode 100644 index 0000000000..dac2cb4de6 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.algorithms.percentage; + +import org.hamcrest.number.BigDecimalCloseTo; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; + +public class BigDecimalPercentageUnitTest { + private BigDecimalPercentages pc = new BigDecimalPercentages(); + + + @Test + public void shouldConvertToPercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000)))); + } + + @Test + public void shouldCalculatePercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000)))); + } + +} diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java new file mode 100644 index 0000000000..dd97e5881c --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.algorithms.percentage; + +import org.hamcrest.number.BigDecimalCloseTo; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; + +public class FastBigDecimalPercentageUnitTest { + private FastBigDecimalPercentage pc = new FastBigDecimalPercentage(); + + + @Test + public void shouldConvertToPercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000)))); + } + + @Test + public void shouldCalculatePercentageOfTotal(){ + BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001)); + Assert.assertTrue("Result not as expected",expected.matchesSafely( + pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000)))); + } + +} From 99e54378c3b5d5a9414226fd0fdf091eee8954ed Mon Sep 17 00:00:00 2001 From: DiegoMarti2 <150871541+DiegoMarti2@users.noreply.github.com> Date: Thu, 14 Dec 2023 00:34:19 +0200 Subject: [PATCH 829/831] Update OutputStreamToByteArrayUnitTest.java --- .../OutputStreamToByteArrayUnitTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java index 0be88b1c07..ed0cab250a 100644 --- a/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java +++ b/core-java-modules/core-java-io-5/src/test/java/com/baeldung/outputstreamtobytearray/OutputStreamToByteArrayUnitTest.java @@ -29,12 +29,10 @@ public class OutputStreamToByteArrayUnitTest { @Test - public void givenByteArrayOutputStream_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { - String data = "Welcome to Baeldung!"; - - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DrainableOutputStream drainableOutputStream = new DrainableOutputStream(byteArrayOutputStream); + public void givenSystemOut_whenUsingDrainableOutputStream_thenReturnByteArray() throws IOException { + String data = "Welcome to Baeldung!\n"; + DrainableOutputStream drainableOutputStream = new DrainableOutputStream(System.out); try (drainableOutputStream) { drainableOutputStream.write(data.getBytes(StandardCharsets.UTF_8)); } @@ -43,7 +41,6 @@ public class OutputStreamToByteArrayUnitTest { assertEquals(data, new String(writtenData, StandardCharsets.UTF_8)); } - public class DrainableOutputStream extends FilterOutputStream { private final ByteArrayOutputStream buffer; From fcc90e03828a1380002740cf85ea681ecdddfcd7 Mon Sep 17 00:00:00 2001 From: Mo Helmy <135069400+BenHelmyBen@users.noreply.github.com> Date: Thu, 14 Dec 2023 01:08:38 +0200 Subject: [PATCH 830/831] This commit is related to BAEL-7341 (#15410) This commit aims to add a test class "StringToCharListUnitTest" that suggests several ways to convert a string into a list of charachters. --- .../StringToCharListUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java new file mode 100644 index 0000000000..1cdbfb9df9 --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/stringtocharlist/StringToCharListUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.stringtocharlist; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.google.common.collect.Lists; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class StringToCharListUnitTest { + public String inputString = "Convert a String to a List of Characters in Java"; + + @Test + public void givenString_whenUsingToCharArray_thenConvertToCharList() { + char[] charArray = inputString.toCharArray(); + + List charList = new ArrayList<>(); + for (char c : charArray) { + charList.add(c); + } + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingMapToObj_thenConvertToCharList() { + List charList = inputString.chars() + .mapToObj(c -> (char) c) + .toList(); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingSplit_thenConvertToStringList() { + String[] charArray = inputString.split(""); + + List charList = Arrays.asList(charArray); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingGuavaLists_thenConvertToCharList() { + List charList = Lists.charactersOf(inputString); + + assertEquals(inputString.length(), charList.size()); + } + + @Test + public void givenString_whenUsingCodePoints_thenConvertToCharList() { + List charList = inputString.codePoints() + .mapToObj(c -> (char) c) + .toList(); + + assertEquals(inputString.length(), charList.size()); + } +} From 97b1af3175a7ee5923cfa80b874f356aee0259b1 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Thu, 14 Dec 2023 07:19:58 +0530 Subject: [PATCH 831/831] added the code (#15272) Co-authored-by: Amit Kumatr --- .../CompletableFutureCallbackExample.java | 30 +++++++++++++ .../ListenableFutureCallbackExample.java | 42 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java create mode 100644 core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java new file mode 100644 index 0000000000..1c642d4ef7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/completablefuture/CompletableFutureCallbackExample.java @@ -0,0 +1,30 @@ +package com.baeldung.callback.completablefuture; + +import java.util.concurrent.CompletableFuture; + +public class CompletableFutureCallbackExample { + public static void main(String[] args) { + CompletableFuture completableFuture = new CompletableFuture<>(); + Runnable runnable = downloadFile(completableFuture); + completableFuture.whenComplete((res, error) -> { + if (error != null) { + // handle the exception scenario + } else if (res != null) { + // send data to DB + } + }); + new Thread(runnable).start(); + } + + private static Runnable downloadFile(CompletableFuture completableFuture) { + return () -> { + try { + //logic to download file + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + completableFuture.complete("pic.jpg"); + }; + } +} diff --git a/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java new file mode 100644 index 0000000000..f3a5e889af --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-5/src/main/java/com/baeldung/callback/listenablefuture/ListenableFutureCallbackExample.java @@ -0,0 +1,42 @@ +package com.baeldung.callback.listenablefuture; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; + + +public class ListenableFutureCallbackExample { + public static void main(String[] args) { + + ExecutorService executorService = Executors.newFixedThreadPool(1); + ListeningExecutorService pool = MoreExecutors.listeningDecorator(executorService); + ListenableFuture listenableFuture = pool.submit(downloadFile()); + + Futures.addCallback(listenableFuture, new FutureCallback() { + @Override + public void onSuccess(String result) { + // code to push fileName to DB + } + + @Override + public void onFailure(Throwable throwable) { + // code to take appropriate action when there is an error + } + }, executorService); + } + + private static Callable downloadFile() { + return () -> { + // Mimicking the downloading of a file by adding a sleep call + Thread.sleep(5000); + return "pic.jpg"; + }; + } + +}